工厂方法模式(Factory Method)

定义

  定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类延迟到其子类。

UML类图

组成       

   1)抽象工厂角色(Creator): 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

       2)具体工厂角色(ConcreteCreator):它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

       3)抽象产品角色(Product):它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

       4)具体产品角色(ConcreteProduct):具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

例子

  一个BMW制造工厂,可以制造各种型号的BMW。

package com.csdhsm.designpattem.factory;

/**  
 * @Title:  BMW.java   
 * @Description: Creator 所有BMW都继承自该类
 * @author: Han   
 * @date:   2016年6月20日 下午5:46:56   
 */  
abstract public class BMW {
    
    public BMW() {}
}
package com.csdhsm.designpattem.factory;

/**  
 * @Title:  BMW320.java   
 * @Description: 320型号BMW
 * @author: Han   
 * @date:   2016年6月20日 下午5:48:05   
 */  
public class BMW320 extends BMW {
    public BMW320() {
        System.out.println("制造--》BMW320");
    }
}
package com.csdhsm.designpattem.factory;

/**  
 * @Title:  BMW523.java   
 * @Description: 523型号BMW
 * @author: Han   
 * @date:   2016年6月20日 下午5:48:35   
 */  
public class BMW523 extends BMW {
    
    public BMW523() {
        System.out.println("制造--》BMW523");
    }
}

  抽象Product

package com.csdhsm.designpattem.factory;

/**  
 * @Title:  FactoryBMW.java   
 * @Description: Factory制造工厂(Product)
 * @author: Han   
 * @date:   2016年6月20日 下午5:49:24   
 */  
public interface FactoryBMW {
    BMW createBMW();
}

  ConcreteProduct

package com.csdhsm.designpattem.factory;

/**  
 * @Title:  FactoryBMW320.java   
 * @Description:  Factory of BMW320
 * @author: Han   
 * @date:   2016年6月20日 下午5:50:29   
 */  
public class FactoryBMW320 implements FactoryBMW {

    @Override
    public BMW createBMW() {
        return new BMW320();
    }
}
package com.csdhsm.designpattem.factory;

/**  
 * @Title:  FactoryBMW523.java   
 * @Description: Factory of BMW523
 * @author: Han   
 * @date:   2016年6月20日 下午5:50:12   
 */  
public class FactoryBMW523 implements FactoryBMW {

    @Override
    public BMW createBMW() {
        return new BMW523();
    }
}

  客户端

package com.csdhsm.designpattem.factory;

public class Solution {
    public static void main(String[] args) {
        FactoryBMW facBmw = new FactoryBMW320();
        facBmw.createBMW();
        facBmw = new FactoryBMW523();
        facBmw.createBMW();
    }
}

  结果

缺点

  工厂方法的加入,使得对象的数量成倍增长。

 posted on 2016-06-20 17:58  韩思明  阅读(148)  评论(0编辑  收藏  举报