[设计模式]2. Factory Method

来源:互联网 发布:淘宝开店模板 编辑:程序博客网 时间:2024/05/22 13:54

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为APabstract 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();}
原创粉丝点击