參考網(wǎng)站
http://www.runoob.com/design-pattern/abstract-factory-pattern.html
什么是抽象工廠模式?
抽象工廠模式是圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠绰筛。該超級(jí)工廠又稱為其他工廠的工廠亏娜。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式拭宁,它提供了一種創(chuàng)建對(duì)象的最佳方式聚假。
在抽象工廠模式中碌廓,接口只負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠敬锐,不需要顯式指定它們的類背传,每個(gè)生成的工廠都能按照工廠模式提供對(duì)象。
我對(duì)于抽象工廠的理解台夺,就是將普通工廠在整合了一下径玖。做一個(gè)創(chuàng)建普通工廠的工廠,這樣對(duì)于普通工廠的拓展就很好拓展颤介。而且通過(guò)抽象工廠的創(chuàng)建類梳星,返回的就是一個(gè)普通工廠赞赖,和開(kāi)始的普通的工廠一樣。例如冤灾,我舉的例子就是說(shuō)前域,因?yàn)橐路泻芏喾N類,所以衣服屬于一個(gè)衣服工廠韵吨。褲子呢匿垄?也一樣,當(dāng)然也應(yīng)該屬于一個(gè)褲子工廠学赛。把衣服褲子整合一下年堆,他們都屬于衣服,向上抽取盏浇。就抽出了一個(gè)服裝工廠变丧。通過(guò)DressProducer.java這個(gè)類來(lái)得到一個(gè)指定的工廠。
使用方法
提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口绢掰,而無(wú)需指定它們具體的類痒蓬。什么時(shí)候使用呢?當(dāng)系統(tǒng)的產(chǎn)品有多個(gè)產(chǎn)品族滴劲,而系統(tǒng)只使用某一族的產(chǎn)品攻晒。
步驟
為衣服創(chuàng)建一個(gè)接口
Clother.java 衣服接口
public interface Clother {
public void show();
}
創(chuàng)建不同類別的衣服
Jacket.java 夾克類
public class Jacket implements Clother {
@Override
public void show() {
System.out.println("我穿的衣服是Jacket");
}
}
Overcoat.java 大衣類
public class Overcoat implements Clother {
@Override
public void show() {
System.out.println("我穿的衣服是大衣");
}
}
為褲子創(chuàng)建一個(gè)接口
Trousers.java 褲子類
public interface Trousers {
public void show();
}
創(chuàng)建不同類別的褲子
Shorts.java 短褲類
public class Shorts implements Trousers {
@Override
public void show() {
System.out.println("我穿的褲子是短褲");
}
}
Pants.java 長(zhǎng)褲類
public class Pants implements Trousers {
@Override
public void show() {
System.out.println("我穿的褲子是皮褲");
}
}
為服裝創(chuàng)建工廠類
DressFactory.java 服裝類
public abstract class DressFactory {
abstract Clother getClother(String clotherName);
abstract Trousers getTrousers(String trousersName);
}
為衣服和褲子創(chuàng)建不同的工廠類,并繼承服裝類
ClothesFactory.java 衣服工廠
public class ClothesFactory extends DressFactory {
@Override
Clother getClother(String clotherName) {
if(clotherName == "jacket")
return new Jacket();
else if(clotherName == "overcoat")//隨便寫的兩種
return new Overcoat();
return null;
}
@Override
Trousers getTrousers(String trousersName) {
return null;
}
}
TrousersFactory.java 褲子工廠
public class TrousersFactory extends DressFactory{
@Override
Clother getClother(String clotherName) {
return null;
}
@Override
Trousers getTrousers(String trousersName) {
if(trousersName == "shorts")
return new Shorts();
else if(trousersName == "pants")//也只寫了兩種,差不多意思得了
return new Pants();
return null;
}
}
為服裝類創(chuàng)建一個(gè)生成器類班挖,通過(guò)傳入不同的字段鲁捏,得到不同的工廠
DressProducer.java 生成器類
public class DressProducer {
public DressFactory getDressFactory(String fatoryName){
if(fatoryName == "clothes")
return new ClothesFactory();
else if(fatoryName == "trousers")
return new TrousersFactory();
return null;
}
}
在客戶端使用DressProducer來(lái)獲取工廠,再通過(guò)工廠萧芙,獲取對(duì)應(yīng)的實(shí)例给梅。
Client.java 客戶端類
public class Client {
public static void main(String args[]){
DressProducer dressProducer = new DressProducer();
//得到工廠類
DressFactory dressFactory = dressProducer.getDressFactory("clothes");
Clother clother1 = dressFactory.getClother("jacket");
Clother clother2 = dressFactory.getClother("overcoat");
dressFactory = dressProducer.getDressFactory("trousers");
Trousers trousers1 = dressFactory.getTrousers("shorts");
Trousers trousers2 = dressFactory.getTrousers("pants");
clother1.show();
clother2.show();
trousers1.show();
trousers2.show();
}
}