1. 程式人生 > >設計模式-工廠方法模式(Factory Method Pattern)

設計模式-工廠方法模式(Factory Method Pattern)

工廠方法模式(Factory Method):將建立一個產品的任務,推遲到子類中。核心工廠類不再負責產品的建立。

這樣核心類成為一個抽象工廠。負責具體子類工廠必須實現的介面。這樣的好處是在不改變具體子類工廠的前提下

增加新的產品。

工廠方法模式角色與結構:

抽象工廠角色(AbstractFactory):是工廠方法模式的核心,建立的子類工廠必須實現這個介面。

具體工廠角色(Concrete Creator):實現抽象工廠的具體工廠類,包含與應用程式密切相關的邏輯,

         並且受到應用程式呼叫建立產品物件。如ProductAFactory,ProductBFactory

抽象產品角色(Product):工廠方法模式建立的物件的基類或者介面。

具體產品角色(Concrete Product):實現了抽象產品角色的具體類。其物件由具體工廠建立產生。他們之間一般為一一對應。

程式碼:

/// <summary>
    /// 抽象工廠
    /// </summary>
    public abstract class AbstractFactory
    {
        public abstract Product Factory();
    }


    /// <summary>
    /// 產品A的建立工廠
    /// </summary>
    public class ProductAFactory:AbstractFactory
    {


        public override Product Factory()
        {
            return new ConcreteProductA();
        }
    }


    /// <summary>
    /// 產品B的建立工廠
    /// </summary>
    public class ProductBFactory : AbstractFactory
    {


        public override Product Factory()
        {
            return new ConcreteProductB();
        }
    }


    /// <summary>
    /// 產品抽象類
    /// </summary>
    public abstract class Product
    {
        /// <summary>
        /// 唯一標識
        /// </summary>
        public string ID
        {
            get;
            set;
        }


        /// <summary>
        /// 產品名稱
        /// </summary>
       public string Name
        {
            get;
            set;
        }


        public abstract void Operate();


        public  void GetName()
        {
            Console.WriteLine("the name of Product is "+Name);
        }
        
    }


    /// <summary>
    /// 產品A
    /// </summary>
    public class ConcreteProductA : Product
    {
        public override void Operate()
        {
            Console.WriteLine("this is the Class if ConcreteProductA");
        }
    }


    /// <summary>
    /// 產品B
    /// </summary>
    public class ConcreteProductB : Product
    {
        public override void Operate()
        {
            Console.WriteLine("this is the Class if ConcreteProductB");
        }
    }

  class Program
    {
        static void Main(string[] args)
        {
            #region 工廠方法模式


            AbstractFactory factoryA = null; // 工廠A
            Product productA = null; // 產品A
            factoryA = new ProductAFactory();
            productA = factoryA.Factory();
            productA.Name = "ProductA";
            productA.Operate();
            productA.GetName();


            AbstractFactory factoryB = null; // 工廠B
            Product productB = null; // 產品B
            factoryB = new ProductBFactory();
            productB = factoryB.Factory();
            productB.Name = "ProductB";
            productB.Operate();
            productB.GetName();


            return;
       
        }
    }