用心理解設計模式——簡單工廠模式 (Simple Factory Pattern)
阿新 • • 發佈:2018-11-21
前置文章: 用心理解設計模式——設計模式的原則
設計模式相關程式碼已統一放至 我的 Github
一、定義
建立型模式之一。
靜態 工廠方法模式。
二、結構解析:
它的一般結構有三種角色:抽象產品、具體產品、工廠。
抽象產品,描述了所有具體產品的公共屬性;
具體產品,是工廠要建立的目標;
工廠,提供了一個“靜態工廠方法”,用來建立具體產品物件。
所以通常,簡單工廠模式也被稱為靜態工廠方法模式。
三、評價
簡單工廠模式封裝了產品建立過程,使用者不需要親力製造,只需輸入建立條件引數即可得到想要得到的產品物件。
簡單工廠模式使產品類和使用者得以解耦。
四、實現
簡單工廠模式的實質是一個根據傳入的條件引數,決定應該建立哪一個產品類的靜態方法。
為什麼是靜態方法?
因為,靜態方法屬於類所有,不和類物件產生聯絡,很容易從所在類中拆卸; 從呼叫的角度來說,可以免去 建立產品時先建立工廠這一步驟,避免記憶體分配。
using System; //簡單工廠模式,根據條件建立 namespace SimpleFactory { //抽象產品類 public abstract class Product { } //具體產品類 public class ConcreteProduct1 : Product { } public class ConcreteProduct2 : Product { } //示例, 使用列舉作為建立引數 public enum ProductType { Product1, Product2 } //可擴充套件新的具體產品 //... //工廠類 public class Factory { //靜態工廠方法 public static Product StaticFactorMethod(ProductType productType) { Product product = null; switch (productType) { case (ProductType.Product1): product = new ConcreteProduct1(); break; case (ProductType.Product2): product = new ConcreteProduct2(); break; //... } return product; } } public class Client { private void Main() { //使用靜態工廠方法建立具體產品1 Factory.StaticFactorMethod(ProductType.Product1); //使用靜態工廠方法建立具體產品2 Factory.StaticFactorMethod(ProductType.Product2); } } }
缺點:
1.違背開閉原則,新增產品需要修改靜態工廠方法,當產品種類過多時,該建立方法會顯得臃腫。
2.違背單一職責原則,新增產品修改靜態工廠方法時,有影響其他產品物件建立的隱患。
3.違背依賴倒置原則,工廠類直接依賴了每種實際產品類。
五、泛型簡單工廠模式
通常,既然多個物件可以通過一個介面統一建立,那他們的構造引數一般都是一致的,要做的只是需要在建立時根據條件引數確定型別。
為了避免以上缺點,可利用泛型進行實現。
1.泛型靜態工廠方法
using System; //簡單工廠模式,泛型靜態工廠方法實現 namespace SimpleFactory.GenericFunction { //抽象產品類 public abstract class Product { } //具體產品類 public class ConcreteProduct1 : Product { } public class ConcreteProduct2 : Product { } //可擴充套件新的具體產品 //... //工廠類 public class Factory { //靜態工廠方法 public static T StaticFactorMethod<T>() { return Activator.CreateInstance<T>(); } } public class Client { private void Main() { //使用靜態工廠方法建立具體產品1 Factory.StaticFactorMethod<ConcreteProduct1>(); //使用靜態工廠方法建立具體產品2 Factory.StaticFactorMethod<ConcreteProduct2>(); } } }
2.泛型工廠類
注意:為了按型別建立工廠,建立方法應作為工廠的一部分。不能使用靜態。
需要將原有的靜態方法改為非靜態。
using System;
//簡單工廠模式,泛型類實現
namespace SimpleFactory.GenericClass
{
//抽象產品類
public abstract class Product { }
//具體產品類
public class ConcreteProduct1 : Product { }
public class ConcreteProduct2 : Product { }
//可擴充套件新的具體產品
//...
//泛型工廠類
public class Factory<T>
{
//工廠方法
public T FactorMethod()
{
return Activator.CreateInstance<T>();
}
}
public class Client
{
private void Main()
{
new Factory<ConcreteProduct1>().FactorMethod();
new Factory<ConcreteProduct2>().FactorMethod();
}
}
}