咖啡馆

有空坐下来喝杯咖啡,放松下心情~
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

工厂方法模式

Posted on 2013-09-26 22:43  mshwu  阅读(286)  评论(0编辑  收藏  举报

1,定义

          所谓工厂方法模式(Factory Method Pattern),就是定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。

 

2,优点

  • 简单工厂模式的进一步抽象,可以使系统在不修改具体工厂角色的情况下引进新的产品, 完全实现“开-闭”原则, 对扩展开发,对修改关闭
  • 依赖于抽象,而不是具体的实现类, 大大降低了客户程序与实现细节的耦合度
  • 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。

 

3, 使用场合

  • 当子类可能会很多, 以后需要不断的增添子类实现时;
  • 当一个系统尚在框架设计阶段,还不知道将来需要实例化哪些具体类时;
  • 系统设计之初不需要具体对象的概念

 

 

 

    image

 

通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:

  • 工厂接口:工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。
  • 具体工厂:具体工厂决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的具体工厂。
  • 抽象产品:抽象产品的主要目的是定义产品的规范,所有的具体产品都必须遵循抽象产品所定义的规范。
  • 具体产品:抽象产品的具体实现,决定了产品在客户端中的具体行为。

抽象工厂生产抽象产品,具体工厂生产具体产品       

 

工厂接口

public  interface ICreateCar  {
    public AbstractCar createCar() ;

}

 

具体工厂

public  class FactoryKindCar  implements ICreateCar {
    @Override
    public AbstractCar createCar() {
        
        return new KindCar("KindCar","Red"); 
    }    
 }

 

抽象产品

public  abstract class AbstractCar  {
    protected String name;
    protected String color;

    public abstract void start();    

 }

 

具体产品

public  class KindCar extends AbstractCar  {

    public KindCar(String name,String color)
    {
        this.name = name;
        this.color = color;
    }
    @Override
    public void start() {
        
        System.out.println("The car "+this.name+" color with "+this.color+" is running!");
        
    }

 }

 

下面建立一个客产测试程序:

public class FactoryMethodTesting {

    public static void main(String[] str)
    {
        ICreateCar createcar = new FactoryKindCar();
        AbstractCar car = createcar.createCar();
        car.start();
    }
    
}

 

这里突出一个原则,永远面向抽象及接口编程,而不是具体实现, 假如有一种新的车要增加,我们只需添加一个具体产品与具体工厂, 丝毫不会影响原来的应用逻辑,支持“开-闭原则。

 

动行结果

image