創建型模式抽象了實例化過程。它們幫助一個系統獨立於如何創建、組合和表示它的那些對象。 1.抽象工廠模式(ABSTRACT FACTORY) 意圖 提供一個創建一系列相關或相互依賴對象的介面,而不需指定他們具體的類。 ( 抽象工廠模式可以向客戶端(Client指代碼模式的使用者,後文類同)提供一個介面 ...
創建型模式抽象了實例化過程。它們幫助一個系統獨立於如何創建、組合和表示它的那些對象。
1.抽象工廠模式(ABSTRACT FACTORY)
意圖
提供一個創建一系列相關或相互依賴對象的介面,而不需指定他們具體的類。
( 抽象工廠模式可以向客戶端(Client指代碼模式的使用者,後文類同)提供一個介面,使得客戶端在不必指定產品的具體類型的情況下,創建多個產品族(Product Family指位於不同產品等級中,功能相關聯的產品的集合)中的產品對象。)
結構
using System; namespace DesignPatterns.Creational { // 測試程式 class MainApp { public static void Main() { // 抽象工廠1 AbstractFactory factory1 = new ConcreteFactory1(); Client c1 = new Client(factory1); c1.Run(); // 抽象工廠2 AbstractFactory factory2 = new ConcreteFactory2(); Client c2 = new Client(factory2); c2.Run(); // 等候用戶輸入 Console.Read(); } } // 抽象工廠 abstract class AbstractFactory { public abstract AbstractProductA CreateProductA(); public abstract AbstractProductB CreateProductB(); } // 具體工廠1 class ConcreteFactory1 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA1(); } public override AbstractProductB CreateProductB() { return new ProductB1(); } } // 具體工廠2 class ConcreteFactory2 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA2(); } public override AbstractProductB CreateProductB() { return new ProductB2(); } } // 抽象產品A,產品族中一個成員 abstract class AbstractProductA { } // 抽象產品B,產品族中一個成員 abstract class AbstractProductB { public abstract void Interact(AbstractProductA a); } // 具體產品A1 class ProductA1 : AbstractProductA { } // 具體產品B1 class ProductB1 : AbstractProductB { public override void Interact(AbstractProductA a) { Console.WriteLine(this.GetType().Name +" interacts with " + a.GetType().Name); } } // 具體產品A2 class ProductA2 : AbstractProductA { } // 具體產品B2 class ProductB2 : AbstractProductB { public override void Interact(AbstractProductA a) { Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name); } } // 客戶端,使用環境 class Client { private AbstractProductA AbstractProductA; private AbstractProductB AbstractProductB; // 構造,註意通過構造傳入抽象工廠 public Client(AbstractFactory factory) { AbstractProductB = factory.CreateProductB(); AbstractProductA = factory.CreateProductA(); } public void Run() { AbstractProductB.Interact(AbstractProductA); } } }
輸出結果為:
ProductB1 interacts with ProductA1
ProductB2 interacts with ProductA2
2.工廠方法模式(FACTORY METHOD)
意圖
定義一個用於創建對象的介面,讓子類決定實例化哪個類。Factory Method 使一個類的實例化延遲到其子類。
結構
適用性
在下列情況下可以使用Factory Method 模式:
- 當一個類不知道它所必須創建的對象的類的時候;
- 當一個類希望由它的子類來指定它所創建的對象的時候;
- 當類將創建對象的職責委托給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
3.單件模式(Singleton Pattern) 我最喜歡用的一個,簡單好用
意圖
保證一個類有且只有一個實例,並提供一個訪問它的全局訪問點。
public class Product{ private Product p; private Product(){ } public Product getProduct{ if(p == null) p = new Product(); return p; } }