概括
名称 | Factory Method |
结构 | |
动机 |
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 |
适用性 |
|
解析
工厂方法模式在网络上有一个形象的比喻:
FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
1.Product
定义工厂方法所创建的对象的接口。
2.ConcreteProduct
实现Product接口。
3.Creator
声明工厂方法,该方法返回一个Product类型的对象*
Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
可以调用工厂方法以创建一个Product对象。
4.ConcreteCreator
重定义工厂方法以返回一个ConcreteProduct实例。
实例
可能看到这里还是不是很清楚。直接看例子好了。涉及的文件有
Product.java
- SoftwareProduct.java
- HardwareProduct.java
Creator.java
- HardwareCreator.java
- SoftwareCreator.java
TestMain.java
在Product 里定义了一个接口方法 doWork(), SoftwareProduct和HardwareProduct分别实现了这个方法。
Creator里定义了一个接口方法getProduct(),SoftwareCreator和HardwareCreator分别实现了这个方法得到不同的 Product.
/** * @author oscar999 * @date 2013-7-17 * @version V1.0 */ package designptn.factorymth; public interface Product { void doWork(); }
/** * @author oscar999 * @date 2013-7-17 * @version V1.0 */ package designptn.factorymth; public class SoftwareProduct implements Product { public void doWork() { System.out.println("product a Software."); } }
/** * @author oscar999 * @date 2013-7-17 * @version V1.0 */ package designptn.factorymth; public class HardwareProduct implements Product { public void doWork() { System.out.println("product a Hardware."); } }
/** * @author oscar999 * @date 2013-7-17 * @version V1.0 */ package designptn.factorymth; public class SoftwareCreator implements Creator { public Product getProduct() { return new SoftwareProduct(); } }
/** * @author oscar999 * @date 2013-7-17 * @version V1.0 */ package designptn.factorymth; public class HardwareCreator implements Creator { public Product getProduct() { return new HardwareProduct(); } }
/** * @author oscar999 * @date 2013-7-17 * @version V1.0 */ package designptn.factorymth; public class TestMain { public static void main(String[] args) { Creator softwareCreator = new SoftwareCreator(); Product softwareProduct = softwareCreator.getProduct(); softwareProduct.doWork(); Creator hardwareCreator = new HardwareCreator(); Product hardwareProduct = hardwareCreator.getProduct(); hardwareProduct.doWork(); } }
从Main 函数的调用来看, 通过不同的Creator,可以得到不同的Product, 而不需要关心具体的Product 是什么样的。