一天一個設計模式——工廠方法(FactoryMethod)模式

1、模式說明java

  在前一個模板方法(Template Method)模式中,父類定義了處理流程,而流程中用到的方法交給子類去實現。相似的,在工廠方法模式中,父類決定如何生成實例,但並不決定所要生成的具體類,具體的處理交由子類來處理。這樣能夠將生成實例的框架和實例自己解耦。面試

  工廠方法模式在不少框架中都有用到,在面試中也問的比較多的,須要重點理解把握。框架

2、工廠方法(Factory Method)模式類圖ide

3、工廠方法(Factory Method)模式中的角色學習

  • Product產品類【框架】:定義了工廠方法模式生成的實例應該持有哪些接口。
  • Creater建立者類【框架】:負責生成Product角色的抽象類。Creater角色對最終生成的實例是一無所知的,它只知道,只要調用Product角色和工廠方法(factoryMethod),就能夠生成Product的實例,無需調用new方法,這樣能夠將父類和其餘具體類耦合。
  • ConreteProduct具體的產品類:工廠方法生成的具體產品。
  • ConcreteCreater具體的建立者類:負責生成具體的產品。

4、工廠方法(Factory Method)代碼示例:this

一、模式框架類的建立,Product類:spa

package com.designpattern.cn.factorymethodpattern.patternframework;

public abstract class Product {
    public abstract void use();
}
View Code

二、模式框架類的建立,Factory類:設計

package com.designpattern.cn.factorymethodpattern.patternframework;

public abstract class Factory {
    public final Product create(String owner){
        Product product = this.createProduct(owner);
        this.registerProduct(product);
        return product;
    }

    protected abstract Product createProduct (String owner);
    protected abstract void registerProduct(Product product);
}
View Code

三、模式實現類,IDCard身份證類:3d

package com.designpattern.cn.factorymethodpattern.patterndemostrate;

import com.designpattern.cn.factorymethodpattern.patternframework.Product;

public class IDCard extends Product {
    private String owner;
    IDCard(String owner){
        System.out.println("製做" + owner + "的ID卡");
        this.owner = owner;
    }

    public void use(){
        System.out.println("使用" + this.owner + "的ID卡");
    }

    public String getOwner() {
        return owner;
    }
}
View Code

四、模式實現類,IDCardFactory類:code

package com.designpattern.cn.factorymethodpattern.patterndemostrate;

import com.designpattern.cn.factorymethodpattern.patternframework.Factory;
import com.designpattern.cn.factorymethodpattern.patternframework.Product;

import java.util.ArrayList;
import java.util.List;

public class IDCardFactory extends Factory {
    private List owners = new ArrayList();
    protected Product createProduct(String owner){
        return new IDCard(owner);
    }

    protected void registerProduct(Product product){
        owners.add(((IDCard)product).getOwner());
    }

    public List getOwners(){
        return owners;
    }
}
View Code

五、Main方法類與運行結果:

 

上面的代碼示例中,工廠模式的createProduct是一個抽象方法,必須在子類中實現該方法,具體能夠選擇三種實現方式:

  1. 指定其爲抽象方法,如同上面的代碼示例同樣;
  2. 爲其實現默認處理:

public Product createProduct(String name){
return new Product(name);
}

若是採用這種方式,Product類就不能定義爲抽象類。

       3.拋出異常的方式:

public Product createProduct(String name){
throw new FactoryMethodRuntimeException();
}

這樣一來,就必須在子類中重寫該方法,不然會拋出異常。

5、工廠方法(Factory Method)模式相關的模式

  • 模板方法(Template Method)模式:工廠方法模式是模板方法模式的典型應用,工廠方法中的createProduct就是模板方法。
  • 單例模式(Singleton):工廠方法模式中,具體的建立者角色(上例中的IDCardFactory)類,能夠設計爲單例模式,由於程序中沒有必要存在多個建立者角色的實例(後續學習到單例模式時再回頭修改這個示例)。
  • 組合(Composite)模式:將對象組合成樹形結構以表示「部分-總體」的層次結構,組合模式使得用戶對單個對象和組合對象的使用具備一致性。工廠方法模式中的Creater和ConcreteCreater對象能夠用到該模式。
  • 迭代器(Iterator)模式:在迭代器模式中,使用iterator方法生成Iterator實例時,會使用工廠方法模式。
相關文章
相關標籤/搜索