概括
解析
工厂方法模式在网络上有一个形象的比喻:
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 -7-17* @version V1.0 */package designptn.factorymth;public interface Product {void doWork();}
/** * @author oscar999 * @date -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 -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 -7-17* @version V1.0 */package designptn.factorymth;public class SoftwareCreator implements Creator {public Product getProduct() {return new SoftwareProduct();}}
/** * @author oscar999 * @date -7-17* @version V1.0 */package designptn.factorymth;public class HardwareCreator implements Creator {public Product getProduct() {return new HardwareProduct();}}
/** * @author oscar999 * @date -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 是什么样的。