Factory Method模式

Factory Method模式

在Factory Method模式中,父類決定實例的生成方式,但並不決定索要生成的具體類,具體的處理全部交給子類負責。這樣就可以將生成的實例框架和實際負責生成實例的類解耦。

示例程序

首先,我們來看一段Factory Method模式的實例程序。這段示例程序的作用是製作身份證(ID卡),他其中有5個類。

Product類和Factory類屬於framework包。這兩個類組成了生成實例的框架、

IDCard類和IDCardFactory;類負責實際的加工處理,他們屬於idcard包。

Main類用於測試程序行爲的類、

在閱讀程序時,注意所閱讀的代碼屬於framework包還是idcard包。

  • 生成實例的框架(framework包)
  • 加工處理idcard包
package framework;
//用來表示產品的類。
//在該類中僅聲明瞭抽象方法use。具體實現交給子類
public abstract class Product {
	public abstract void use();
}
package framework;
/**
 * 在Factory類中,我們使用了Template Method模式。
 * 該類還聲明瞭用於“生成產品”的createProduct抽象方法和用於“註冊產品”的
 * registerProduct抽象方法。這兩個方法的具體實現則交給Factory類的子類負責。
 * 
 * 在這個框架中,我們定義了工廠是用來“調用create方法,生成Product實例”的。而
 * create方法的實現實現調用createProduct生成產品。接着調用registerProduct
 * 註冊產品。
 * 
 * 具體的實現內容根據Factory Method模式適用的場景不同而不同。但是,只要Factory Method模式,
 * 在生成實例時就會用到Template Method模式。
 * **/
public abstract class Factory {
	public final Product create(String owner) {
		Product p=createProduct(owner);
		registerProduct(p);
		return p;
	}

	protected abstract void registerProduct(Product p);

	protected abstract Product createProduct(String owner);
}
package idcard;
import framework.*;

public class IDCard extends Product {
	private String owner;
	IDCard(String owner){
		System.out.println("製作"+owner+"的ID卡");
		this.owner=owner;
	}
	@Override
	public void use() {
		System.out.println("使用"+owner+"的ID卡");
	}
	public String getOwner() {
		return owner;
	}
}
package idcard;
import framework.*;
import java.util.*;
/**
 * IDCardFactory類實現了createProduct犯法和registerProduct方法。
 * createProduct方法通過生成IDCard的實例來生成產品。
 * registerProduct方法則通過將IDCard的owner保存到owners字段中來實現“註冊產品”
 * **/
public class IDCardFactory extends Factory{
	private List owners= new ArrayList<String>();
	@Override
	protected void registerProduct(Product p) {
		owners.add(p);
	}

	@Override
	protected Product createProduct(String owner) {
		
		return new IDCard(owner);
	}
	public List getOwners() {
		return owners;
	}

}
import framework.*;
import idcard.*;

public class Main {
	public static void main(String[] args) {
		Factory factory=new IDCardFactory();
		Product card1=factory.create("曉明");
		Product card2=factory.create("小紅");
		Product card3=factory.create("小剛");
		card1.use();
		card2.use();
		card3.use();
	}
}

Factory Method模式中的登場角色

Product(產品)

Product角色屬於框架這一方面,是一個抽象類。他定義了在Factory Method,模式中生成的那些實例所持有的接口,但具體的處理則由子類ConcreteProduct角色決定。在示例程序彙總,由Product類扮演此角色。

Creator(創建者)

Creator角色屬於框架這一方,它是負責生成Product角色的抽象類,但具體的處理由子類ConcreteCreator角色決定。在示例程序中,由Factory類扮演次角色。

Creator角色對於示例負責生成實例的ConcreteCreator角色一無所知。它位移知道的就是,只要調用Product角色和生成實例的方法,就可以生成Product實例、在示例程序中,createProduct方法是用於生成實例的方法。不用new關鍵字來生成實例,而是調用生成實例的專用方法來生成實例,這樣就可以放置防止與其他具體類耦合。

ConcreteProduct(具體的產品)

ConcreteProduct角色屬於具體家棟這一方,它決定了具體的產品。在示例程序中,由IDCard類扮演此角色。

ConcreteCreator(具體的創建者)

ConcreteCreator角色屬於具體加工這一方,它負責生成具體的產品。在示例程序中,由IDCardFactory類扮演此角色。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章