设计模式——简单工厂模式
简单工厂模式定义为:简单工厂模式又称为静态工厂方法模型,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式结构图:
简单工厂模式包含如下角色:
1.Factory(工厂角色)
工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以直接被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。
2.Product(抽象产品角色)
抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
3.ConcreteProduct(具体产品类)
具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法 。
下面通过一个简单的例子实现简单工厂模式。
题目:使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
1.未增加Robot之前的类图
为了保证系统的扩展性并将各种人类型对象的创建封装在一个统一的方法中,引入一个person接口。
Person是一个接口,其中包含了所有人都具有的业务方法create()。
1.1未增加Robot之前
Nvwa代码
package simple_factory_pattern; public class Nvwa { public static Person getPerson(String person1) throws Exception { if (person1.equalsIgnoreCase("M")){ return new Man(); } else if (person1.equalsIgnoreCase("W")){ return new Women(); }else { throw new Exception("对不起,暂时无法创造该人。"); } } }
Person接口
package simple_factory_pattern; public interface Person { public void create(); }
Man类
package simple_factory_pattern; public class Man implements Person{ @Override public void create() { System.out.println("成功创造了男人..."); } }
Women类
package simple_factory_pattern; public class Women implements Person{ @Override public void create() { System.out.println("成功创建了女人..."); } }
测试未增加Robot之前的代码:
package simple_factory_pattern; public class Test { public static void main(String[] args) throws Exception { Person person; String person1 = "W"; person = Nvwa.getPerson(person1); person.create(); } }
输出结果正常:
2.增加Robot之后的类图
2.1增加一个新的Robot类之后整体代码
只是需要修改nvwa代码
package simple_factory_pattern; public class Nvwa { public static Person getPerson(String person1) throws Exception { if (person1.equalsIgnoreCase("M")){ return new Man(); } else if (person1.equalsIgnoreCase("W")){ return new Women(); }else if (person1.equalsIgnoreCase("R")){ return new Robot(); } else { throw new Exception("对不起,暂时无法创造该人。"); } } }
以及新增一个Robbt类
package simple_factory_pattern; public class Robot implements Person{ @Override public void create() { System.out.println("成功创造了机器人..."); } }
测试输出Robot