工厂方法模式

1.    模式定义

工厂方法模式 (Factory Method) 是创建模式的一种,也叫虚拟构造子 (Virture Constractor) 模式或多态性工厂 (Polymorphic Factory) 模式。

       工厂方法模式定义一个抽象的对象创建类或接口,将实际的对象创建工作交给子类来实现。

2.    模式介绍

2.1. 简单类图

 <v:stroke joinstyle="miter"></v:stroke><v:path o:connecttype="rect" gradientshapeok="t"></v:path> <v:shape type="#_x0000_t202" style="margin-top: 246.2pt; z-index: 1; left: 0px; margin-left: 136.9pt; width: 90pt; position: absolute; height: 23.4pt; text-align: left;" id="_x0000_s1042"> </v:shape>

2.2. 类图对应示例代码

2.2.1. 抽象产品: AbstractProduct

public interface AbstractProduct{

  public void printName();

}

<o:p> </o:p>

2.2.2. 具体产品: ConcreteProduct1 ConcreteProduct2

java 代码
 
  1.  public class ConcreteProduct1 implements AbstractProduct{  
  2.   
  3.   public void printName(){  
  4.   
  5.     System.out.println(“ConcreteProduct1”);  
  6.   
  7. }  
  8.   
  9. }  
  10.   
  11. public class ConcreteProduct2 implements AbstractProduct{  
  12.   
  13.   public void printName(){  
  14.   
  15.     System.out.println(“ConcreteProduct2”);  
  16.   
  17. }  
  18.   
  19. }   

<o:p> </o:p>

2.2.3. 抽象工厂: AbstractFactory

public interface AbstractFactory {

  public AbstractProduct factoryMethod();

}

2.2.4. 具体工厂: ConcreteFactory1 ConcreteFactory2

public class ConcreteFactory1 implements AbstractFactory{

  public AbstractProduct factoryMethod(){

//do something.

return new ConcreteProduct1();

}

}

<o:p> </o:p>

public class ConcreteFactory2 implements AbstractFactory{

  public AbstractProduct factoryMethod(){

//do something.

return new ConcreteProduct2();

}

}

<o:p> </o:p>

3.    模式特点

3.1. 开闭原则(优点)

工厂方法模式解决了简单工厂模式的一些缺陷,是在简单工厂模式的基础上发展的。

简 单工厂模式把所有的重心放到工厂类上,一旦向系统增加新的产品,就必须修改工厂类,不满足开闭原则;工厂方法模式提供一个抽象的工厂接口,在不同的产品结 构上实现不同的产品工厂具体类来创建该层次中的产品,通常一个具体工厂创建一个具体产品。在新增产品的时候,只需要实现新的对应工厂就可以满足需要,是符 合开闭原则的。

<o:p> </o:p>

3.2. 缺点

  1. 相比简单工厂模式,工厂方法模式客户端编程复杂,每个产品的创建都需要实例化对应的工厂类。
  2. 相对的扩展性,当需要修改产品结构中的对各产品的时候,需要修改各个工厂(当然也可以直接新加入很多新的产品和工厂,但这样不是又增加了很多无用的遗留类吗,而且现实中很可能要修改客户端代码了。),而简单工厂模式仍然只要修改一个工厂类。
  3. 现实中常常要使用退化模式,失去多态性。实际设计中经常会有子类新增功能,那么在对应工厂生产该类的时候就需要直接返回该具体类,而不是抽象产品,不然就要向下转型了。

你可能感兴趣的:(设计模式,编程,工作)