04_抽象工廠模式

野码發表於2024-03-08

抽象工廠模式是一種建立型設計模式,它提供一個介面用於建立一系列相關或相互依賴物件的工廠,而不需要指定具體的類。這種模式透過提供一個抽象的工廠介面,使得客戶端可以建立一系列產品物件而無需關心具體的實現細節。

在抽象工廠模式中,通常會定義一個抽象工廠介面,其中包含多個方法用於建立不同型別的產品。具體的工廠類會實現這個介面,並實現具體的產品建立邏輯。客戶端程式碼透過呼叫工廠方法來建立產品物件,而不需要了解具體的產品類。

抽象工廠模式適用於需要建立一系列相關物件並且這些物件之間存在一定的依賴關係的場景。它可以幫助降低程式碼耦合度,提高程式碼的可維護性和擴充套件性。

總的來說,抽象工廠模式可以幫助我們實現將物件的建立與使用分離,提供一種靈活的方式來建立一系列相關物件。

Product

/// <summary>
    /// 手機
    /// </summary>
    public interface IPhone
    {
        /// <summary>
        /// 數量
        /// </summary>
        int Amount { get; }
        /// <summary>
        /// 生產
        /// </summary>
        /// <param name="amount"></param>
        /// <param name="days"></param>
        /// <returns></returns>
        int Produce(int amount,int days);
        /// <summary>
        /// 列印
        /// </summary>
        void Write();
    }

/// <summary>
    /// 電視
    /// </summary>
    public interface ITV
    {
        /// <summary>
        /// 數量
        /// </summary>
        int Amount { get; }
        /// <summary>
        /// 生產
        /// </summary>
        /// <param name="amount"></param>
        /// <param name="days"></param>
        /// <returns></returns>
        int Produce(int amount, int days);
        /// <summary>
        /// 列印
        /// </summary>
        void Print();
    }

ConcreteProduct

蘋果手機

04_抽象工廠模式
public class AppleTV : ITV
    {
        public int Amount { get; private set; }

        public void Print()
        {
            Console.WriteLine($"蘋果電視一共生產了{Amount}臺");
        }

        public int Produce(int amount, int days)
        {
            Amount = amount * days * 128;

            return Amount;
        }


    }
View Code

蘋果電視

04_抽象工廠模式
public class ApplePhone : IPhone
    {
        public int Amount {get;private set;}

        public int Produce(int amount, int days)
        {
            Amount = amount * days * 1000;

            return Amount;
        }

        public void Write()
        {
            Console.WriteLine($"蘋果手機一共生產了{Amount}臺");
        }
    }
View Code

三星手機

04_抽象工廠模式
public class SamsungPhone : IPhone
    {
        public int Amount {get;private set;}

        public int Produce(int amount, int days)
        {
            Amount = amount * days * 555;

            return Amount;
        }

        public void Write()
        {
            Console.WriteLine($"三星手機一共生產了{Amount}臺");
        }
    }
View Code

三星電視

04_抽象工廠模式
internal class SamsungTV : ITV
    {
        public int Amount { get; private set; }

        public void Print()
        {
            Console.WriteLine($"三星電視一共生產了{Amount}臺");
        }

        public int Produce(int amount, int days)
        {
            Amount = amount * days * 250;

            return Amount;
        }


    }
View Code

Creator

 /// <summary>
    /// 抽象工廠
    /// </summary>
    public interface IFactory
    {
        ITV GetTV();
        IPhone GetPhone();
    }

ConcreteCreator

 /// <summary>
    /// 蘋果工廠
    /// </summary>
    public class AppleFactory : IFactory
    {
        public IPhone GetPhone()
        {
            return new ApplePhone();
        }

        public ITV GetTV()
        {
            return new AppleTV();
        }
    }

/// <summary>
    /// 三星工廠
    /// </summary>
    public class SamsungFactory : IFactory
    {
        public IPhone GetPhone()
        {
            return new SamsungPhone();
        }

        public ITV GetTV()
        {
            return new SamsungTV();
        }
    }

呼叫

public class Client
    {
        public void Start()
        {
            IFactory appleFactory = new AppleFactory();
            DoStuff(appleFactory);

            IFactory samsungFactory = new SamsungFactory();
            DoStuff(samsungFactory);
        }

        private void DoStuff(IFactory factory)
        {
            Console.WriteLine($"{factory.GetType().Name} 開始生產");
            var phone = factory.GetPhone();
            phone.Produce(99, 90);
            phone.Write();

            var tv = factory.GetTV();
            tv.Produce(88, 90);
            tv.Print();
            Console.WriteLine($"{factory.GetType().Name} 生產結束");

        }

    }

static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

相關文章