抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...
在工廠方法模式中,工廠只負責生產(chǎn)具體的產(chǎn)品,每一個具體的工廠對應(yīng)著一個具體的產(chǎn)品,工廠方法也具有唯一性,如果有時候我們需要一個工廠方法提供多個產(chǎn)品而不是一個單一的產(chǎn)品,例如:海爾品牌不止生產(chǎn)海爾TV,還生產(chǎn)海爾冰箱,海爾空調(diào)等等,如果使用工廠方法模式就需要產(chǎn)生很多個工廠類來實現(xiàn),而抽象工廠模式只需要一個工廠類即可生產(chǎn)一個品牌的多種產(chǎn)品。所以抽象工廠模式比工廠方法模式更加簡單,有效率。
抽象工廠模式
1.抽象工廠模式動機
可以看出,如果使用工廠方法模式,就需要創(chuàng)建20個具體工廠類才能生產(chǎn)上圖的所有產(chǎn)品,如果使用抽象工廠模式,只需要4個類,分別是三星廠,松下廠,TCL廠和海爾廠。
2.抽象工廠模式定義
抽象工廠模式就是定義一個可以生產(chǎn)對象的接口,讓子類決定要生產(chǎn)哪一個類的接口,工廠方法模式讓類的實例化程序延遲到子類中實行。
3.抽象工廠模式的結(jié)構(gòu)圖
參與者說明:
AbstractFactory(抽象工廠)
△抽象工廠中可一個定義各組方法,每組方法對應(yīng)著一個產(chǎn)品等級結(jié)構(gòu)(一種類型如風扇)。
ConcreteFactoryA和ConcreteFactoryB(具體工廠)
△實現(xiàn)抽象工廠中的生成抽象產(chǎn)品方法,生產(chǎn)一組具體產(chǎn)品,這類產(chǎn)品形成一個產(chǎn)品族(一個品牌,如TCL),每個產(chǎn)品都位于某個產(chǎn)品的等級結(jié)構(gòu)中。
AbstractProductA和AbstractProductB(抽象產(chǎn)品A和抽象產(chǎn)品B)
△為等級結(jié)構(gòu)中的成員聲明抽象業(yè)務(wù)方法。
ConcreteProduct (A1/A2/B1/B2)(具體產(chǎn)品)
△具體產(chǎn)品,具有唯一的產(chǎn)品族和產(chǎn)品等級結(jié)構(gòu)屬性。
4.抽象工廠模式主要代碼(一個簡單的例子)
抽象產(chǎn)品類
(電視)TV.cs
public interface TV
{
public void Play();
}
(風扇)Fan.cs
public interface Fan
{
public void Play();
}
具體產(chǎn)品類
(海爾電視)HaiErTV.cs
public class HaiErTV : TV
{
public void Play()
{
Console.WriteLine("海爾電視");
}
}
(海爾風扇)HaiErFan.cs
public class HaiErFan : Fan
{
public void Play()
{
Console.WriteLine("海爾風扇");
}
}
(TCL電視)TCLTV.cs
public class TCLTV : TV
{
public void Play()
{
Console.WriteLine("TCL電視");
}
}
(TCL風扇)TCLFan.cs
public class TCLFan : Fan
{
public void Play()
{
Console.WriteLine("TCL風扇");
}
}
抽象工廠類
AbsractFactory.cs
public interface AbstractFactory
{
public TV CreateTV();
public Fan CreateFan();
}
具體工廠類
(海爾)HaiErFactory.cs
public class HaiErFactory : AbstractFactory
{
public TV CreateTV()
{
return new HaiErTV();
}
public Fan CreateFan()
{
return HaiErFan();
}
}
(TCL)TCLFactory.cs
public class TCLFactory : AbstractFactory
{
public TV CreateTV()
{
return new TCLTV();
}
public Fan CreateFan()
{
return TCLFan();
}
}
測試
AbstractFactory factory;/*定義抽象工廠*/
TV tv;/*定義抽象電視*/
Fan fan;/*定義抽象風扇*/
factory = new HaiErFactory();
tv = factory.CreateTV();
tv.Play();/*海爾電視*/
fan = factory.CreateFan();
fan.Play();/*海爾風扇*/
5.總結(jié)
優(yōu)點
△隔離了具體類的生成,是的客戶端并不需要知道什么被創(chuàng)建。由于這種隔離,更換了一個具體工廠就變得相對容易。所有的具體工廠都實現(xiàn)了抽象工廠中定義的那些公共接口,因此只需要改變具體工廠的實例,就可以在某種程度上改變整個軟件系統(tǒng)的行為。實現(xiàn)高內(nèi)聚低耦合。
△當一個產(chǎn)品族中的多個對象被設(shè)計成一起工作的時候,抽象工廠模式能夠保證客戶端只使用同一個產(chǎn)品族中的對象。
△增加新的具體工廠和產(chǎn)品族很方便,無需要修改已有系統(tǒng)。
缺點
△在添加新產(chǎn)品對象是,難以拓展抽象工廠來生產(chǎn)新種類的產(chǎn)品,這是因為抽象工廠角色中規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合。要支持新種類的產(chǎn)品就意味著要對該接口進行拓展,需要修改代碼。
6.參考
《設(shè)計模式》主編:劉偉
總結(jié)
以上是生活随笔為你收集整理的抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输卵管不孕怎么治疗好
- 下一篇: shell监控java接口服务_Linu