[设计模式]2. Factory Method

Factory Method

image

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

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

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

image

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 类别里的不变与会变部分加以分离开来,并纳入父、子类别里。

变与不变之分离

image

//针对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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值