每天一个设计模式(4):简单工厂“模式”
4.简单工厂“模式”
一.简单工厂介绍
1.1 简单工厂定义
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。实际上简单工厂并不是一种设计模式,反而比较像一种编程习惯,可以将客户程序从具体类解耦。
1.2 适用场景
简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂。如数据库生产工厂就是简单工厂的一个应用。
简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。
1.3 优缺点
采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性
缺点是可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,不符合OCP(开闭原则)的原则。
二.UML关系图
由上图我们可以看到简单工厂模式由三部分组成:
- 简单工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
- 抽象产品角色(Product):简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
- 具体产品角色(Concrete Product):简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
三.简单工厂例子
本人认为下面这个女娲造人的例子是说明简单工厂“模式”最经典的例子,通过该例子可以清晰的认识到简单工厂。
3.1 女娲造人
话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面。
首先,在这个造人的思想里面,有几个重要的角色:女娲本身、抽象的人的概念和女娲所造出的一个个具体的人。
- 女娲是一个工厂类,也就是简单工厂模式的核心角色。
- 抽象的人是最早只存在于女娲的头脑里的一个想法,女娲按照这个想法造出的一个个具体的人,便都符合这个抽象的人的定义。换言之,这个抽象的想法规定了所有具体的人必须都有的接口(特征或者功能)。
- 具休的一个个的人,包括张三,李四等。这些人便是简单工厂模式里面的具体产品角色
其UML类图出下所示:
其中女娲对应的就是简单工厂角色,女娲脑里的想法对应的就是抽象产品角色,创造出出来的具休的人对应的就是具体产品角色。
示例代码:
1 //定义女娲脑里对人的抽象概念的接口 2 interface People{ 3 public void eat(); 4 public void sleep(); 5 public void talk(); 6 } 7 8 //创造具体人类的具体实现类 9 class Zhangsan implements People{ 10 public void eat(){ 11 System.out.println("Zhangsan can eat。。。。。"); 12 } 13 public void sleep(){ 14 System.out.println("Zhangsan can sleep。。。。。"); 15 } 16 public void talk(){ 17 System.out.println("Zhangsan can talk。。。。。"); 18 } 19 } 20 21 class Lisi implements People{ 22 public void eat(){ 23 System.out.println("Lisi can eat。。。。。"); 24 } 25 public void sleep(){ 26 System.out.println("Lisi can sleep。。。。。"); 27 } 28 public void talk(){ 29 System.out.println("Lisi can talk。。。。。"); 30 } 31 } 32 33 //女娲简单工厂 34 class Nvwa{ 35 public static People getPeopleInstance(String type){ 36 People p=null; 37 if("Zhangsan".equals(type)){ 38 p=new Zhangsan(); 39 } 40 if("Lisi".equals(type)){ 41 p=new Lisi(); 42 } 43 return p; 44 } 45 } 46 47 public class FactoryDemo { 48 public static void main(String[] args) { 49 People p=Nvwa.getPeopleInstance("Zhangsan"); 50 if(p!=null){ 51 p.eat(); 52 p.sleep(); 53 p.talk(); 54 }else{ 55 System.out.println("造不了这种人。。。"); 56 } 57 } 58 }
3.2 生产披萨
UML类图:
示例代码:
1 简单工厂实现披萨店 2 3 public class SimplePizzaFactory 4 { 5 public Pizza createPizza(String type) 6 { 7 Pizza pizza = null; 8 if(type.equals("cheese")) 9 { 10 pizza = new CheesePizza(); 11 } 12 else if(type.equals("greel")) 13 { 14 pizza = new GreekPizza(); 15 } 16 else if(type.equals("pepperoni")) 17 { 18 pizza = new PepperoniPizza(); 19 } 20 return pizza; 21 } 22 } 23 public class PizzaStore 24 { 25 SimplePizzaFactory factory; 26 27 public PizzaStore(SimplePizzaFactory factory) 28 { 29 this.factory = factory; 30 } 31 public Pizza orderPizza(String type) 32 { 33 Pizza pizza; 34 pizza = factory.createPizza(type); 35 pizza.prepare(); 36 pizza.bake(); 37 pizza.cut(); 38 pizza.box(); 39 return pizza; 40 } 41 }
四.总结
总结一下:简单工厂模式分离产品的创建者和消费者,有利于软件系统结构的优化;但是由于一切逻辑都集中在一个工厂类中,导致了没有很高的内聚性,同时也违背了“开放封闭原则”。另外,简单工厂模式的方法一般都是静态的,而静态工厂方法是无法让子类继承的,因此,简单工厂模式无法形成基于基类的继承树结构。
参考:《Head First设计模式》
http://blog.csdn.net/weiwenlongll/article/details/6918164
http://www.blogjava.net/jzgl-ever/archive/2008/07/26/217704.html