欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[设计模式]2. Factory Method

程序员文章站 2022-06-15 11:30:12
...

Factory Method

[设计模式]2. Factory Method

基于此 Template Method 模式, Product 抽象类的 template_method() 会反向呼叫 ConcreteProduct 应用类别的 hook_method() 。

然而,其复杂难解的问题是:必须先创建建 ConcreteProduct 之对象后,才能返向呼叫到 ConcreteProduct子类别的 hook_method() 函数。

但是,在编写框架的抽象类时,还不知有那些应用类别,又如何使用new 指令去创建应用类别之对象呢?(Factory Method)

[设计模式]2. 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 类别里的不变与会变部分加以分离开来,并纳入父、子类别里。

变与不变之分离

[设计模式]2. Factory Method

//针对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();
}
相关标签: 设计模式