一. 工廠方法模式
1. 定義和特點
(1). 定義:定義一個建立産品對象的工廠接口,然後把産品對象的實際建立工作放到具體的子類工廠當中實作。
PS:
① 我們把被建立的對象成為“産品”,建立産品的對象稱為“工廠”。如果建立的産品不多,且基本不會增加新産品,隻需要一個工廠類即可,這種模式叫做“簡單工廠”,它不屬于23種設計模式,它的缺點是違背了開閉原則。
② 此處的介紹的‘抽象工廠’,是對簡單工廠模式的進一步抽象化,其好處是可以使系統在不修改原來代碼的情況下引進新的産品,即滿足開閉原則。
(2). 優點:
A. 使用者隻需要知道具體工廠的名稱就可得到所要的産品,無須知道産品的具體建立過程.
B. 在系統增加新的産品時隻需要添加具體産品類和對應的具體工廠類,無須對原工廠進行任何修改,滿足開閉原則.
(3). 缺點:
每增加一個産品就要增加一個具體産品類和一個對應的具體工廠類,這增加了系統的複雜度。
2. 具體實作
(1). 模式的結構
A. 抽象工廠(Abstract Factory):提供了建立産品的接口,調用者通過它通路具體工廠的工廠方法 如: newProduct() 來建立産品。
B. 具體工廠(ConcreteFactory):主要是實作抽象工廠中的抽象方法,完成具體産品的建立。
C. 抽象産品(Product):定義了産品的規範,描述了産品的主要特性和功能。
D. 具體産品(ConcreteProduct):實作了抽象産品角色所定義的接口,由具體工廠來建立,它同具體工廠之間一一對應。
結構圖如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SOyUGM1IDO5cjZ2EzNkFGNlJmYjNTZ5QjZiZzMyI2Nw8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
(2). 應用場景
需要畫各種圖,比如Circle、Rectangle、Square,首先要有一個Draw方法,我們可以把它抽象成一個接口,讓每個形狀類去實作它;形狀類的建立我們采用工廠去建立,可以先抽象出來一個工廠接口,聲明建立對象的方法CreateShape,然後讓每個形狀的子工廠去實作它。
如果形狀有限,且不經常添加,直接建立一個簡單工廠來執行個體化各個形狀類即可。
(3). 代碼實操
形狀類代碼:
/// <summary>
/// 形狀接口
/// </summary>
public interface IShape
{
/// <summary>
/// 畫圖方法
/// </summary>
public void Draw();
}
/// <summary>
/// 圓形
/// </summary>
public class Circle : IShape
{
public void Draw()
{
Console.WriteLine("畫出一個圓形");
}
}
/// <summary>
/// 矩形
/// </summary>
public class Rectangle : IShape
{
public void Draw()
{
Console.WriteLine("畫出一個矩形區域");
}
}
/// <summary>
/// 正方形
/// </summary>
public class Square : IShape
{
public void Draw()
{
Console.WriteLine("畫出一個正方形區域");
}
}
簡單工廠代碼:
/// <summary>
/// 形狀工廠類 (簡單工廠)
/// </summary>
public class SimpleFactory
{
/// <summary>
/// 通過名稱擷取對應的形狀類
/// </summary>
/// <param name="shapeType"></param>
/// <returns></returns>
public IShape getShape(String shapeType)
{
if (shapeType == null)
{
return null;
}
if (shapeType.Equals("CIRCLE"))
{
return new Circle();
}
else if (shapeType.Equals("RECTANGLE"))
{
return new Rectangle();
}
else if (shapeType.Equals("SQUARE"))
{
return new Square();
}
return null;
}
}
工廠方法代碼:
/// <summary>
/// 抽象所有工廠的接口
/// </summary>
public interface AbstractFactory
{
//建立具體的‘對象’接口
IShape CreateShape();
}
/// <summary>
/// Circle工廠類
/// </summary>
public class CircleFactory : AbstractFactory
{
public IShape CreateShape()
{
return new Circle();
}
}
/// <summary>
/// Rectangle工廠類
/// </summary>
public class RectangleFactory : AbstractFactory
{
public IShape CreateShape()
{
return new Rectangle();
}
}
/// <summary>
/// Square工廠類
/// </summary>
public class SquareFactory : AbstractFactory
{
public IShape CreateShape()
{
return new Square();
}
}
測試結果:
//簡單工廠的實作
{
Console.WriteLine("-------------------下面簡單工廠的實作------------------------");
SimpleFactory shapeFactory = new SimpleFactory();
//擷取 Circle 的對象,并調用它的 draw 方法
IShape shape1 = shapeFactory.getShape("CIRCLE");
shape1.Draw();
//擷取 Rectangle 的對象,并調用它的 draw 方法
IShape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.Draw();
//擷取 Square 的對象,并調用它的 draw 方法
IShape shape3 = shapeFactory.getShape("SQUARE");
shape3.Draw();
}
//工廠方法的實作
{
Console.WriteLine("-------------------下面工廠方法的實作------------------------");
//擷取 Circle 的對象,并調用它的 draw 方法
AbstractFactory f1 = new CircleFactory();
IShape shape1 = f1.CreateShape();
shape1.Draw();
//擷取 Rectangle 的對象,并調用它的 draw 方法
AbstractFactory f2 = new RectangleFactory();
IShape shape2 = f2.CreateShape();
shape2.Draw();
//擷取 Square 的對象,并調用它的 draw 方法
AbstractFactory f3 = new CircleFactory();
IShape shape3 = f3.CreateShape();
shape3.Draw();
}
運作結果:
更多C++背景開發技術點知識内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒體,音視訊開發,Linux核心,TCP/IP,協程,DPDK多個進階知識點。
C/C++Linux伺服器開發進階架構師/C++背景開發架構師免費學習位址
【文章福利】另外還整理一些C++背景開發架構師 相關學習資料,面試題,教學視訊,以及學習路線圖,免費分享有需要的可以點選領取
二. 抽象工廠模式
1. 背景
前面介紹【工廠方法模式】考慮的是一類産品的生産,如 形狀類隻畫圖、畜牧場隻養動物、電視機廠隻生産電視機、計算機軟體學院隻培養計算機軟體專業的學生等。
同種類稱為同等級,也就是說:【工廠方法模式】隻考慮生産同等級的産品,但是在現實生活中許多工廠是綜合型的工廠,能生産多等級(種類) 的産品,如 工具類既能畫圖也能染色、農場裡既養動物又種植物,電器廠既生産電視機又生産洗衣機或空調,大學既有軟體專業又有生物專業等。
本節要介紹的【抽象工廠模式】将考慮多等級産品的生産,将同一個具體工廠所生産的位于不同等級的一組産品稱為一個産品族,圖 1 所示的是海爾工廠和 TCL 工廠所生産的電視機與空調對應的關系圖。
2. 定義和特點
(1) 定義:是一種為通路類提供一個建立一組相關或互相依賴對象的接口,且通路類無須指定所要産品的具體類就能得到同族的不同等級的産品的模式結構。抽象工廠模式是工廠方法模式的更新版本,工廠方法模式隻生産一個等級的産品,而抽象工廠模式可生産多個等級的産品。
抽象工廠需要滿足下面條件:
A. 系統中有多個産品族,每個具體工廠建立同一族但屬于不同等級結構的産品。
B. 系統一次隻可能消費其中某一族産品,即同族的産品一起使用。
(2).優點
A. 可以在類的内部對産品族中相關聯的多等級産品共同管理,而不必專門引入多個新的類來進行管理。
B. 當增加一個新的産品族時不需要修改原代碼,滿足開閉原則。
(3).缺點
當産品族中需要增加一個新的産品時,所有的工廠類都需要進行修改。
3. 具體實作
(1). 模式的結構
抽象工廠模式同工廠方法模式一樣,也是由抽象工廠、具體工廠、抽象産品和具體産品等 4 個要素構成,但抽象工廠中方法個數不同,抽象産品的個數也不同。
A. 抽象工廠(Abstract Factory):提供了建立産品的接口,它包含多個建立産品的方法 newProduct(),可以建立多個不同等級的産品。
B. 具體工廠(Concrete Factory):主要是實作抽象工廠中的多個抽象方法,完成具體産品的建立。
C. 抽象産品(Product):定義了産品的規範,描述了産品的主要特性和功能,抽象工廠模式有多個抽象産品。
D. 具體産品(ConcreteProduct):實作了抽象産品角色所定義的接口,由具體工廠來建立,它 同具體工廠之間是多對一的關系。
結構圖如下:
(2). 應用場景
我既要畫圖又要染色,且畫圖和染色有個對應關系:Circle對應Blue,Rectangle對應Green, 這個時候我們就要使用抽象工廠模式, 形狀和顔色屬于‘同族下的不同産品’,設計抽象工廠,定義建立形狀和建立顔色的方法,同時設計多個子工廠,每個子工廠繼承抽象工廠,并且實作屬于自己的形狀和顔色的建立。
(3). 代碼實操
具體産品類(形狀和顔色)
/// <summary>
/// 形狀接口
/// </summary>
public interface IShape2
{
/// <summary>
/// 畫圖方法
/// </summary>
public void Draw();
}
/// <summary>
/// 圓形
/// </summary>
public class Circle2 : IShape2
{
public void Draw()
{
Console.WriteLine("畫出一個圓形");
}
}
/// <summary>
/// 矩形
/// </summary>
public class Rectangle2 : IShape2
{
public void Draw()
{
Console.WriteLine("畫出一個矩形區域");
}
}
/// <summary>
/// 顔色接口
/// </summary>
public interface IColor2
{
/// <summary>
/// 填充顔色方法
/// </summary>
public void Fill();
}
class Blue2 : IColor2
{
public void Fill()
{
Console.WriteLine("Inside Blue:我是藍色");
}
}
class Green2 : IColor2
{
public void Fill()
{
Console.WriteLine("Inside Green:我是綠色");
}
}
抽象工廠類和子工廠代碼
/// <summary>
/// 抽象工廠
/// 核心:在一個工廠裡聚合多個同類産品。
/// (這裡也可以定義成接口)
/// </summary>
public abstract class AbstractFactory2
{
public abstract IColor2 CreateColor();
public abstract IShape2 CreateShape();
}
/// <summary>
/// 工廠1
/// (用來圖Blue2色 和 建立Cicle2形狀)
/// </summary>
public class ConcreteFactory1 : AbstractFactory2
{
public override IColor2 CreateColor()
{
return new Blue2();
}
public override IShape2 CreateShape()
{
return new Circle2();
}
}
/// <summary>
/// 工廠2
/// (用來圖Blue2色 和 建立Cicle2形狀)
/// </summary>
public class ConcreteFactory2 : AbstractFactory2
{
public override IColor2 CreateColor()
{
return new Green2();
}
public override IShape2 CreateShape()
{
return new Rectangle2();
}
}
測試代碼
//工廠1 畫圖并填充顔色
AbstractFactory2 f1 =new ConcreteFactory1();
IShape2 s1 = f1.CreateShape();
IColor2 c1 = f1.CreateColor();
s1.Draw();
c1.Fill();
//工廠2 畫圖并填充顔色
AbstractFactory2 f2 = new ConcreteFactory2();
IShape2 s2 = f2.CreateShape();
IColor2 c2 = f2.CreateColor();
s2.Draw();
c2.Fill();
運作結果
原文連結:https://www.cnblogs.com/yaopengfei/p/13428543.html