每天一个设计模式(4):简单工厂“模式”

4.简单工厂“模式”

一.简单工厂介绍

1.1 简单工厂定义

  简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。实际上简单工厂并不是一种设计模式,反而比较像一种编程习惯,可以将客户程序从具体类解耦。

1.2 适用场景

  简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂。如数据库生产工厂就是简单工厂的一个应用。

  简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

1.3 优缺点

  采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性

  缺点是可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,不符合OCP(开闭原则)的原则。

二.UML关系图

由上图我们可以看到简单工厂模式由三部分组成:

  • 简单工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
  • 抽象产品角色(Product):简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
  • 具体产品角色(Concrete Product):简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

三.简单工厂例子

本人认为下面这个女娲造人的例子是说明简单工厂“模式”最经典的例子,通过该例子可以清晰的认识到简单工厂。

3.1 女娲造人

话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面。

首先,在这个造人的思想里面,有几个重要的角色:女娲本身、抽象的人的概念和女娲所造出的一个个具体的人。

  1. 女娲是一个工厂类,也就是简单工厂模式的核心角色。
  2. 抽象的人是最早只存在于女娲的头脑里的一个想法,女娲按照这个想法造出的一个个具体的人,便都符合这个抽象的人的定义。换言之,这个抽象的想法规定了所有具体的人必须都有的接口(特征或者功能)。
  3. 具休的一个个的人,包括张三,李四等。这些人便是简单工厂模式里面的具体产品角色

 其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

原文地址:https://www.cnblogs.com/Eason-S/p/5681488.html