设计模式 --抽象工厂

//以下文字内容摘自网络;

工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题.

抽象工厂模式:提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类,抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么。这样客户就可以从具体产品中被解耦.

抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展,这真是抽象工厂模式的优点所在,然后抽象模式同时也存在不足的地方.

知道了抽象工厂的优缺点之后,也就能很好地把握什么情况下考虑使用抽象工厂模式了,下面就具体看看使用抽象工厂模式的系统应该符合那几个前提:

  • 一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
  • 这个系统有多个系列产品,而系统中只消费其中某一系列产品
  • 系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现

具体代码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 ");
        }
    }



}




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