工廠(chǎng)方法模式
工廠(chǎng)方法模式(FACTORY METHOD)是一種常用的類(lèi)創(chuàng)建型設(shè)計(jì)模式,此模式的核心精神是封裝類(lèi)中變化的部分,提取其中個(gè)性化善變的部分為獨(dú)立類(lèi),通過(guò)依賴(lài)注入以達(dá)到解耦、復(fù)用和方便后期維護(hù)拓展的目的。它的核心結(jié)構(gòu)有四個(gè)角色,分別是抽象工廠(chǎng);具體工廠(chǎng);抽象產(chǎn)品;具體產(chǎn)品;
抽象工廠(chǎng)角色
是工廠(chǎng)方法模式的核心,與應(yīng)用程序無(wú)關(guān)。任何在模式中創(chuàng)建的對(duì)象的工廠(chǎng)類(lèi)必須實(shí)現(xiàn)這個(gè)接口。
具體工廠(chǎng)角色
這是實(shí)現(xiàn)抽象工廠(chǎng)接口的具體工廠(chǎng)類(lèi),包含與應(yīng)用程序密切相關(guān)的邏輯,并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。在上圖中有兩個(gè)這樣的角色:BulbCreator與TubeCreator。
抽象產(chǎn)品角色
工廠(chǎng)方法模式所創(chuàng)建的對(duì)象的超類(lèi)型,也就是產(chǎn)品對(duì)象的共同父類(lèi)或共同擁有的接口。在上圖中,這個(gè)角色是Light。
具體產(chǎn)品角色
這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專(zhuān)門(mén)的具體工廠(chǎng)創(chuàng)建,它們之間往往一一對(duì)應(yīng)。
適用場(chǎng)景
在任何需要生成復(fù)雜對(duì)象的地方,都可以使用工廠(chǎng)方法模式。有一點(diǎn)需要注意的地方就是復(fù)雜對(duì)象適合使用工廠(chǎng)模式,而簡(jiǎn)單對(duì)象,特別是只需要通過(guò)new就可以完成創(chuàng)建的對(duì)象,無(wú)需使用工廠(chǎng)模式。
工廠(chǎng)模式是一種典型的解耦模式,迪米特法則在工廠(chǎng)模式中表現(xiàn)的尤為明顯。假如調(diào)用者自己組裝產(chǎn)品需要增加依賴(lài)關(guān)系時(shí),可以考慮使用工廠(chǎng)模式。將會(huì)大大降低對(duì)象之間的耦合度。
當(dāng)需要系統(tǒng)有比較好的擴(kuò)展性時(shí),可以考慮工廠(chǎng)模式,不同的產(chǎn)品用不同的實(shí)現(xiàn)工廠(chǎng)來(lái)組裝。
C# 代碼實(shí)現(xiàn)
- 創(chuàng)建抽象產(chǎn)品類(lèi)
//圖形的接口
public interface IShape
{
void Draw();
}
- 創(chuàng)建具體產(chǎn)品類(lèi)
//正方形實(shí)現(xiàn)類(lèi)
public class Square : IShape
{
public void Draw()
{
Console.WriteLine($"{this.GetType().Name} >>> Draw");
}
}
//長(zhǎng)方形實(shí)現(xiàn)類(lèi)
public class Rectangle : IShape
{
public void Draw()
{
Console.WriteLine($"{this.GetType().Name} >>> Draw");
}
}
//圓形實(shí)現(xiàn)類(lèi)
public class Circle : IShape
{
public void Draw()
{
Console.WriteLine($"{this.GetType().Name} >>> Draw");
}
}
- 創(chuàng)建抽象工廠(chǎng)類(lèi)
//圖形抽象工廠(chǎng)
public interface IShapeFactory
{
IShape GetShape();
}
- 創(chuàng)建工廠(chǎng)實(shí)現(xiàn)類(lèi)
//圓形工廠(chǎng)
public class CircleFactory : IShapeFactory
{
public IShape GetShape()
{
return new Circle();
}
}
//長(zhǎng)方形工廠(chǎng)
public class RectangleFactory : IShapeFactory
{
public IShape GetShape()
{
return new Rectangle();
}
}
//正方形工廠(chǎng)
public class SquareFactory : IShapeFactory
{
public IShape GetShape()
{
return new Square();
}
}
- 調(diào)用
class Program
{
static void Main(string[] args)
{
IShapeFactory shapeFactory1 = new SquareFactory();
IShape shape1 = shapeFactory1.GetShape();
shape1.Draw();
IShapeFactory shapeFactory2 = new RectangleFactory();
IShape shape2 = shapeFactory2.GetShape();
shape2.Draw();
IShapeFactory shapeFactory3 = new CircleFactory();
IShape shape3 = shapeFactory3.GetShape();
shape3.Draw();
Console.ReadKey();
}
}