工厂方法模式(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(); } }
结果
缺点
工厂方法的加入,使得对象的数量成倍增长。
时间: 2024-10-09 00:02:05