[设计模式]2. Factory Method
程序员文章站
2022-06-15 11:30:12
...
Factory Method
基于此 Template Method 模式, Product 抽象类的 template_method() 会反向呼叫 ConcreteProduct 应用类别的 hook_method() 。
然而,其复杂难解的问题是:必须先创建建 ConcreteProduct 之对象后,才能返向呼叫到 ConcreteProduct子类别的 hook_method() 函数。
但是,在编写框架的抽象类时,还不知有那些应用类别,又如何使用new 指令去创建应用类别之对象呢?(Factory Method)
package cn.pw.java.dp.factorymethod;
public class FactoryMethodMain {
public static void main(String[] args) {
Client ca = new Client();
ca.FactoryMethod();
}
}
abstract class Product {
public void template_method() {
System.out.println(hook_method());
}
protected abstract String hook_method();
}
class ConcreteProduct extends Product {
private String name;
ConcreteProduct(String na) {
name = na;
}
@Override
protected String hook_method() {
return name;
}
}
class Client {
public void FactoryMethod() {
Product obj = new ConcreteProduct("JEEP");
obj.template_method();
}
}
由于 ConcreteProduct 是子类别,其包含着「会变」的部份,包括其名称:
“ConcreteProduct” 本身都是「会变」的。
因而 Client 类别的 factoryMethod() 函数:Product obj = new ConcreteProduct(“JEEP”);
也是「会变」 ( 即会随着应用类别的名称之改变而变 ) 的部份了。于是,基于「变与不变分离」原则,可以将 Client 类别里的不变与会变部分加以分离开来,并纳入父、子类别里。
变与不变之分离
//针对Client变化部分分离AP,AbsClient抽象到AF,ConcreteClient为AP
abstract class AbsClient{
Product obj;
abstract void FactoryMethod(); // abstract Product FactoryMethod();
void client_template_method() {
FactoryMethod(); //...
obj.template_method(); // FactoryMethod().template_method();
}
}
//ConcreteClient1,2,3...
class ConcreteClient extends AbsClient {
public void FactoryMethod() { // Product FactoryMethod();
obj = new ConcreteProduct("JEEP");
}
}
public static void main(String[] args) {
AbsClient ca = new ConcreteClient();
ca.client_template_method();
}
推荐阅读