設計模式 --抽象工廠

//以下文字內容摘自網絡;

工廠方法模式是爲了克服簡單工廠模式的缺點而設計出來的,簡單工廠模式的工廠類隨着產品類的增加需要增加額外的代碼),而工廠方法模式每個具體工廠類只完成單個實例的創建,所以它具有很好的可擴展性。但是在現實生活中,一個工廠只創建單個產品這樣的例子很少,因爲現在的工廠都多元化了,一個工廠創建一系列的產品,如果我們要設計這樣的系統時,工廠方法模式顯然在這裏不適用,然後抽象工廠模式卻可以很好地解決一系列產品創建的問題.

抽象工廠模式:提供一個創建產品的接口來負責創建相關或依賴的對象,而不具體明確指定具體類,抽象工廠允許客戶使用抽象的接口來創建一組相關產品,而不需要知道或關心實際生產出的具體產品是什麼。這樣客戶就可以從具體產品中被解耦.

抽象工廠模式將具體產品的創建延遲到具體工廠的子類中,這樣將對象的創建封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利於後期的維護和擴展,這真是抽象工廠模式的優點所在,然後抽象模式同時也存在不足的地方.

知道了抽象工廠的優缺點之後,也就能很好地把握什麼情況下考慮使用抽象工廠模式了,下面就具體看看使用抽象工廠模式的系統應該符合那幾個前提:

  • 一個系統不要求依賴產品類實例如何被創建、組合和表達的表達,這點也是所有工廠模式應用的前提。
  • 這個系統有多個系列產品,而系統中只消費其中某一系列產品
  • 系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現

具體代碼demo實現:

主程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using abstractFactory.Factory;
namespace Factory
{
    class Program
    {
        static void Main(string[] args)
        {
            
            //創建2個工廠
            //Creator potatoesFactory = new PotatoesFactory();
            //Creator tomatoFactory = new TomatoFactory();
            ////生產對應的產品
            //Food potatoes = potatoesFactory.CreateFoodFactory();
            //Food tomatoegg = tomatoFactory.CreateFoodFactory();
            //Console.Read();

            PackageBFactory pbfactory = new PackageBFactory();
            Console.WriteLine("ok! you need to pay: $ "+ pbfactory.CreatePackage());
            Console.Read();

        }
    }
}
工廠類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace abstractFactory.Factory
{
     
    /// <summary>
    /// KFC工廠接口
    /// 實現兩個方法,一個生產食物,一個是生產飲料
    /// </summary>
    public abstract class KFCFactory {
        protected abstract List<Food> CreateFood();
        protected abstract List<Drink> CreateDrink();
    }

    public interface PackageFactory {
        double CreatePackage();
    }

    /// <summary>
    /// 套餐A工廠
    /// </summary>
    public class PackageAFactory : KFCFactory, PackageFactory    {


        public double CreatePackage() {
              CreateFood();
              CreateDrink();
              return ShoudPay();
        }

        private double totalPrice = 0.00;
        /// <summary>
        /// 創建食物
        /// </summary>
        /// <returns></returns>
        protected override List<Food> CreateFood()
        {
            List<Food> foods = new List<Food>();
            Hamburger hamburger = new Hamburger();
             totalPrice+= hamburger.GetPrice();
            foods.Add(hamburger);
            Chicken chicken = new Chicken();
            totalPrice += chicken.GetPrice();
            foods.Add(chicken);
            return foods;
        }
        /// <summary>
        /// 創建飲料
        /// </summary>
        /// <returns></returns>
        protected override List<Drink> CreateDrink()
        {

            List<Drink> drinks = new List<Drink>();
            CocaCala cocacala =  new CocaCala();
            totalPrice += cocacala.GetPrice();
            drinks.Add(cocacala);
            return drinks; 
        }

        private double ShoudPay() {
            return totalPrice;
        }
        
    }

    /// <summary>
    /// 套餐B工廠
    /// </summary>
    public class PackageBFactory : KFCFactory, PackageFactory  
    {

        public double CreatePackage()
        {
            CreateFood();
            CreateDrink();
            return ShoudPay();
        }

        private double totalPrice = 0.00;
        /// <summary>
        /// 創建食物
        /// </summary>
        /// <returns></returns>
        protected override List<Food> CreateFood()
        {
            List<Food> foods = new List<Food>();
            Hamburger hamburger = new Hamburger();
            totalPrice += hamburger.GetPrice();

            Chips chips = new Chips();
            totalPrice += chips.GetPrice();
            foods.Add(hamburger);
            foods.Add(chips);
            return foods;
        }
        /// <summary>
        /// 創建飲料
        /// </summary>
        /// <returns></returns>
        protected override List<Drink> CreateDrink()
        {

            List<Drink> drinks = new List<Drink>();
            Coffee cofee = new Coffee();
            totalPrice += cofee.GetPrice();
            drinks.Add(cofee);
            return drinks;
        }

        private  double ShoudPay()
        {
            return totalPrice;
        }
    }
    /// <summary>
    /// 食物基類
    /// </summary>
    public abstract class Food {     
        public abstract void Print();
        protected double price ;
        public abstract double GetPrice();
    }
    /// <summary>
    /// 飲品基類
    /// </summary>
    public abstract class Drink {       
        public abstract void Print();
        protected double price;
        public abstract double GetPrice();
    }
    /// <summary>
    /// Hamburger
    /// </summary>
    public class Hamburger : Food {
        public Hamburger() {
            this.Print();
            this.price = 12.00;            
        }
        /// <summary>
        /// price
        /// </summary>
        /// <returns></returns>
        public override double GetPrice()
        {
            return this.price;
        }
        
        public override void Print()
        {
            Console.WriteLine("Hamburger is ready! price :$12.00 ");
        }
    }
    /// <summary>
    /// Chicken
    /// </summary>
    public class Chicken : Food {
        public Chicken() {
            this.Print();
            this.price = 18.99;
        }

        /// <summary>
        /// price
        /// </summary>
        /// <returns></returns>
        public override double GetPrice()
        {
            return this.price;
        }
        

        public override void Print()
        {
            Console.WriteLine("Chicken is ready! price :$18.99 ");
        }
    }
    /// <summary>
    /// chips
    /// </summary>
    public class Chips : Food {
        public Chips() {
            this.Print();
            this.price = 4.44;
        }

        /// <summary>
        /// price
        /// </summary>
        /// <returns></returns>
        public override double GetPrice()
        {
            return this.price;
        }
        

        public override void Print()
        {
            Console.WriteLine("Chips is ready! price :$4.44 ");
        }
    }
    /// <summary>
    /// CocaCala
    /// </summary>
    public class CocaCala : Drink {
        public CocaCala() {
            Print();
            this.price = 1.00;
        }
        /// <summary>
        /// price
        /// </summary>
        /// <returns></returns>
        public override double GetPrice()
        {
            return this.price;
        }
        

        public override void Print()
        {
            Console.WriteLine("CocaCala is ready! price = 1.00 ");
        }
    }
    /// <summary>
    /// Coffee
    /// </summary>
    public class Coffee : Drink {
        public Coffee()
        {
            Print();
            this.price = 2.00;
        }
        /// <summary>
        /// price
        /// </summary>
        /// <returns></returns>
        public override double GetPrice()
        {
            return this.price;
        }
        
        public override void Print()
        {
            Console.WriteLine("Coffee is ready! price = 2.00 ");
        }
    }



}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章