?? d_factory.java
字號(hào):
/*
1、工廠模式:客戶(hù)類(lèi)和工廠類(lèi)分開(kāi)。消費(fèi)者任何時(shí)候需要某種產(chǎn)品,只需向工廠請(qǐng)求即可。消費(fèi)者無(wú)須修改就可以接納新產(chǎn)品。缺點(diǎn)是當(dāng)產(chǎn)品修改時(shí),工廠類(lèi)也要做相應(yīng)的修改。如:如何創(chuàng)建及如何向客戶(hù)端提供。
2、FACTORY METHOD—請(qǐng)MM去麥當(dāng)勞吃漢堡,不同的MM有不同的口味,要每個(gè)都記住是一件煩人的事情,我一般采用Factory Method模式,帶著MM到服務(wù)員那兒,說(shuō)“要一個(gè)漢堡”,具體要什么樣的漢堡呢,讓MM直接跟服務(wù)員說(shuō)就行了。
對(duì)比:Abstract Factory需要處理的是“一系列相互依賴(lài)”的產(chǎn)品的創(chuàng)建,即抽象工廠創(chuàng)建的是一組產(chǎn)品;而Factory Method需要處理的單個(gè)產(chǎn)品的創(chuàng)建工作。
當(dāng)一個(gè)類(lèi)不知道他所必需創(chuàng)建對(duì)象的類(lèi)或一個(gè)類(lèi)希望有子類(lèi)指定他所創(chuàng)建的類(lèi)型時(shí)(也就是說(shuō)一個(gè)類(lèi)中的某個(gè)對(duì)象需要由子類(lèi)來(lái)創(chuàng)建時(shí)),此時(shí)我們使用Factory Method;
當(dāng)系統(tǒng)有多于一個(gè)的產(chǎn)品組合,而系統(tǒng)只需要使用其中某一產(chǎn)品組合,此時(shí)我們一般使用Abstract Factory;
工廠方法模式:核心工廠類(lèi)不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建的工作交給
子類(lèi)去做,成為一個(gè)抽象工廠角色,僅負(fù)責(zé)給出具體工廠類(lèi)必須實(shí)現(xiàn)的接口,而不
接觸哪一個(gè)產(chǎn)品類(lèi)應(yīng)當(dāng)被實(shí)例化這種細(xì)節(jié)。
實(shí)現(xiàn)要點(diǎn)
1、抽象工廠將產(chǎn)品對(duì)象的創(chuàng)建延遲到它的具體工廠的子類(lèi)。
2、如果沒(méi)有應(yīng)對(duì)“多系列對(duì)象創(chuàng)建”的需求變化,則沒(méi)有必要使用抽象工廠模式,這時(shí)候使用簡(jiǎn)單的靜態(tài)工廠完全可以。
3、系列對(duì)象指的是這些對(duì)象之間有相互依賴(lài)、或作用的關(guān)系,例如游戲開(kāi)發(fā)場(chǎng)景中的“道路”與“房屋”的依賴(lài),“道路”與“地道”的依賴(lài)。
4、抽象工廠模式經(jīng)常和工廠方法模式共同組合來(lái)應(yīng)對(duì)“對(duì)象創(chuàng)建”的需求變化。
5、通常在運(yùn)行時(shí)刻創(chuàng)建一個(gè)具體工廠類(lèi)的實(shí)例,這一具體工廠的創(chuàng)建具有特定實(shí)現(xiàn)的產(chǎn)品對(duì)象,為創(chuàng)建不同的產(chǎn)品對(duì)象,客戶(hù)應(yīng)使用不同的具體工廠。
6、把工廠作為單件,一個(gè)應(yīng)用中一般每個(gè)產(chǎn)品系列只需一個(gè)具體工廠的實(shí)例,因此,工廠通常最好實(shí)現(xiàn)為一個(gè)單件模式。
7、創(chuàng)建產(chǎn)品,抽象工廠僅聲明一個(gè)創(chuàng)建產(chǎn)品的接口,真正創(chuàng)建產(chǎn)品是由具體產(chǎn)品類(lèi)創(chuàng)建的,最通常的一個(gè)辦法是為每一個(gè)產(chǎn)品定義一個(gè)工廠方法,一個(gè)具體的工廠將為每個(gè)產(chǎn)品重定義該工廠方法以指定產(chǎn)品,雖然這樣的實(shí)現(xiàn)很簡(jiǎn)單,但它確要求每個(gè)產(chǎn)品系列都要有一個(gè)新的具體工廠子類(lèi),即使這些產(chǎn)品系列的差別很小。
*/
/*
* SessionFactory說(shuō)明工廠的作用。抽象工廠描述加工過(guò)程
*/
import java.util.*;
public class D_factory{
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("結(jié)城浩");
Product card2 = factory.create("戶(hù)村");
Product card3 = factory.create("佐藤花子");
card1.use();
card2.use();
card3.use();
}
}
abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
class IDCardFactory extends Factory {
private Vector owners = new Vector();
protected Product createProduct(String owner) {
return new IDCard(owner);
}
protected void registerProduct(Product product) {
owners.add(((IDCard)product).getOwner());
}
public Vector getOwners() {
return owners;
}
}
abstract class Product {
public abstract void use();
}
class IDCard extends Product {
private String owner;
IDCard(String owner) {
System.out.println("建立" + owner + "的卡。");
this.owner = owner;
}
public void use () {
System.out.println("使用" + owner + "的卡。");
}
public String getOwner() {
return owner;
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -