設計模式-簡單工廠


定義

百度文庫:簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。

標准定義:簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。

基本簡介

簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一類產品(這些產品繼承自一個產品的父類或者接口)的實例,該模式包含的角色和職責。

(1)工廠(Creator)角色

簡單工廠模式的核心,他負責實現創建所有實例的內部邏輯。工廠類的創建產品類方法可以直接被外界調用,創建所需的產品對象。

(2)抽象產品(Product)角色

簡單工廠模式所創建所有對象的父類,他負責描述所有實例所共有的公共接口。

(3)具體產品(Concrete Product)角色

簡單工廠模式的創建目標,所有創建的對象都是充當這個角色某個具體類的實例。

 

UML圖

示例1

抽象產品的簡單工廠

(1.1)抽象產品

     /// <summary>
    /// 抽象產品
    /// </summary>
    public abstract class Product
    {
        public abstract void Create();
    }

(1.2)具體產品ProductA,ProductB

    /// <summary>
    /// 具體產品A
    /// </summary>
    public class ProductA : Product
    {
        public override void Create()
        {
            Console.WriteLine("create product_A");
        }
    }

    /// <summary>
    /// 具體產品B
    /// </summary>
    public class ProductB : Product
    {

        public override void Create()
        {
            Console.WriteLine("create product_B");
        }
    }

(1.3)工廠創建

    /// <summary>
    /// 工廠類,根據參數判斷創建何種實例
    /// </summary>
    public class CreateFactory
    {
        public static Product InstanceCreater(string type)
        {
            switch (type)
            {
                case "ProductA":
                    return new ProductA();
                case "ProductB":
                    return new ProductB();
                default:
                    throw new NotImplementedException();
            }
        }
    }

(1.4)實例調用

 Product product = CreateFactory.InstanceCreater("ProductA");

示例2

(2.1)概念產品計算器類

     /// <summary>
    /// 計算類
    /// </summary>
    public class Operation
    {
        /// <summary>
        /// 數字A
        /// </summary>
        public double NumberA { get; set; }
        /// <summary>
        /// 數字B
        /// </summary>
        public double NumberB { get; set; }

        /// <summary>
        /// 得到運算結果
        /// </summary>
        /// <returns></returns>
        public virtual double CalcResult()
        {
            double result = 0;
            return result;
        }
    }

(2.2)具體操作eg:加法,減法

     /// <summary>
    /// 加法類
    /// </summary>
    public class OperationAdd : Operation
    {
        public override double CalcResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }

    /// <summary>
    /// 減法類
    /// </summary>
    public class OperationSub : Operation
    {
        public override double CalcResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }

(2.3)工廠計算器方法

     /// <summary>
    /// 工廠計算方法類
    /// </summary>
    public class OperationFactory
    {
        public static Operation GetOperationInstance(string operate)
        {
            Operation opera = null;
            switch (operate)
            {
                case "+":
                    opera = new OperationAdd();
                    break;
                case "-":
                    opera = new OperationSub();
                    break;
                default:
                    throw new NotImplementedException();
            }
            return opera;
        }
    }

(2.4)調用

     Operation operation = OperationFactory.GetOperationInstance("+");
     operation.NumberA = 10;
     operation.NumberB = 10;
     Console.WriteLine(operation.CalcResult());        

  

深入分析

簡單工廠解決的問題是如何如何去實例化一個合適的對象

簡單工廠核心思想有一個專門的類負責創建實例的過程

具體來說把產品看成一系列類的集合,這些類是由某個抽象類或者接口派生出來的一個對象樹,而工廠類用來產生一個合適的對象滿足客戶的需求。如果簡單工廠模式所涉及的具體產品之間沒有共同的邏輯,那么我們就可以使用接口來扮演抽象產品的角色,如果具體產品之間有相似的功能或邏輯,我們就把這些相似的邏輯提取出來放到抽象類中。然后具體產品繼承抽象類,為了實現更好的復用,共同或者重復的東西應該抽象出來。

優缺點

(1)優點

工廠類是整個模式的關鍵所在,它包含必要的判斷邏輯,能夠根據外界的指定條件實例化相應具體產品,用戶在使用時可以直接根據工廠類創建所需要的實例,無需了解對象是如何創建以及如何組織的。有利於軟件結構體系優化。

(2)缺點

由於工廠類集中了所有類的創建邏輯,這就導致一旦這個工廠出現問題,所有的客戶端都收到牽連。由於簡單工廠模式的產品基於一個共同的抽象類后者接口,這樣一來,當產品種類增加的時候

總結:

簡單工廠模式分離產品的創建者和消費者,有利於軟件系統的機構化;但猶豫一切邏輯都集中在工廠類中,導致了沒有很高的內聚性,同時也違背了開放封閉原則。另外,簡單工廠模式的方法一般是靜態的,而靜態工廠方法是無法讓子類繼承的,因此簡單工廠無法形成基於基類的繼承樹結構。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM