1. 程式人生 > >用心理解設計模式——簡單工廠模式 (Simple Factory Pattern)

用心理解設計模式——簡單工廠模式 (Simple Factory Pattern)

前置文章: 用心理解設計模式——設計模式的原則 

設計模式相關程式碼已統一放至 我的 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();
        }
    }
}