一、Factory Method 模式(将生成的实例交给子类)
该模式用于生成实例,Factory 是工厂,用 Template Method 模式来构建生成实例的工厂。
在这个模式中,父类决定实例的生成方式,但并不决定索要生成的具体的类,具体的处理全部交给子类来负责。
这样就可以将生成实例的框架(framework)和实际负责生成实例的类解耦
二、示例程序
这个示例程序的功能是制作身份证(ID卡),它其中有 5个类
| 类称 | 功能 |
|---|---|
| Product | 只定义抽象方法 use 的抽象类 |
| Factory | 实现了 create() 方法的抽象类 |
| IDCard | 实现了 use() 方法的类 |
| IDCardFactory | 实现了 createProduct、registerProduct 方法的类 |
| Main | 测试程序行为的类 |
2.1 框架类 (framework包下的)
Product
package Factory.framework;/*** 声明产品的类,仅声明 use 方法,方法的实现交给子类负责* 定义产品 ”任意是可以 use 的“*/public abstract class Product {public abstract void use();}
Factory
package Factory.framework;/*** 我们使用 Template Method 模式* 声明:* 1. 用于生成产品的 createProduct 抽象方法* 2. 用于注册产品的 registerProduct 抽象方法* 具体实现内容根据 Factory Method 适用的场景不同而不同,具体生成示例的时候一定会使用到 Template Method 模式*/public abstract class Factory {public final Product create(String owner) {Product p = createProduct(owner);registerProduct(p);return p;}protected abstract void registerProduct(Product p);protected abstract Product createProduct(String owner);}
2.2 idCard
IDCard
package Factory.idcard;import Factory.framework.*;/*** 负责加工处理*/public class IDCard extends Product{private String owner;public IDCard(String owner) {System.out.println("制作"+owner +"的 ID 卡");this.owner = owner;}public void use() {System.out.println("使用" + owner + "的 ID 卡");}public String getOwner() {return owner;}}
IDCardFactory
package Factory.idcard;import Factory.framework.Factory;import Factory.framework.Product;import java.util.*;/*** 实现了* 1. createProduct() 通过 IDCard* 2. reigisterProduct() 方法*/public class IDCardFactory extends Factory {private List owners = new ArrayList();protected Product createProduct(String owner) {return new IDCard(owner);}protected void registerProduct(Product p) {owners.add(((IDCard)p).getOwner());}public List getOwners() {return owners;}}
2.3 main
package Factory;import Factory.framework.Factory;import Factory.framework.Product;import Factory.idcard.IDCardFactory;public class Main {public static void main(String[] args) {Factory factory = new IDCardFactory();Product card1 = factory.create("小明");Product card2 = factory.create("小张");card1.use();card2.use();}}

