抽象工厂(Abstract Factory)模式

一、 抽象工厂(Abstract Factory)模式

  抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。

  为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族

      

二、 Abstract Factory模式的结构:

  抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。

  具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,

  而这个逻辑是与应用系统的商业逻辑紧密相关的。

  抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。

  具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。

  这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。

    /// <summary>
    /// 抽象工厂(Abstract Factory)模式
    /// 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //非洲大陆食物链
            ContinentFactory africa = new AfricaFactory();
            AnimalWorld world = new AnimalWorld(africa);
            world.RunFoodChain();
 
            //美洲大陆食物链
            ContinentFactory america = new AmericaFactory();
            world = new AnimalWorld(america);
            world.RunFoodChain();

            Console.ReadLine();
        }
    }
/// <summary>
    ///  抽象工厂 角色 --> 大陆工厂
    /// </summary>
    public abstract class ContinentFactory
    {
        public abstract Herbivore CreateHerbivore();
        public abstract Carnivore CreateCarnivore();
    }

     /// <summary>
    /// 具体工厂  -- 具体大陆  非洲大陆 Africa
    /// 有两种类型动物 食草 食肉 那就穿件 实例
    /// Wildebeest Lion
    /// </summary>
    public class AfricaFactory : ContinentFactory
    {
        override public Herbivore CreateHerbivore()
        { return new Wildebeest(); }

        override public Carnivore CreateCarnivore()
        { return new Lion(); }
    }

    /// <summary>
    ///  具体 工厂 -- 具体大陆 America 美洲大陆   
    ///  有两种类型动物 食草 食肉 那就穿件 实例
    ///  Bison Wolf
    /// </summary>
    public class AmericaFactory : ContinentFactory
    {
        override public Herbivore CreateHerbivore()
        { return new Bison(); }

        override public Carnivore CreateCarnivore()
        { return new Wolf(); }
    }

    /// <summary>
    /// 抽象产品 -- Carnivore 食肉动物
    /// </summary>
    public abstract class Carnivore
    {
        public abstract void Eat(Herbivore h);
    }

    /// <summary>
    /// 抽象产品 角色 --> 食草动物 
    /// </summary>
    public abstract class Herbivore
    {
    }

    /// <summary>
    /// 具体产品 -- Bison 野牛 
    /// </summary>
    public class Bison : Herbivore
    {
        public string names = "Bison 野牛";
    }


    /// <summary>
    /// 具体产品  Lion 狮子
    /// </summary>
    public class Lion : Carnivore
    {
        public override void Eat(Herbivore h)
        {
            //吃羚羊
            Console.WriteLine(this + " eats " + h);
        }
    }

    /// <summary>
    /// 具体产品  -- Wildebeest 羚羊
    /// </summary>
    public class Wildebeest : Herbivore
    {
    }
    /// <summary>
    /// 具体产品 Wolf 狼
    /// </summary>
    public class Wolf : Carnivore
    { 
        public override void Eat(Herbivore h)
        {
            Console.WriteLine(this + " eats " + h);
        }
    }
    
    /// <summary>
    /// 创建具体食物链对象
    /// </summary>
    public class AnimalWorld
    {
        private Herbivore herbivore;
        private Carnivore carnivore;
         
        public AnimalWorld(ContinentFactory factory)
        {
            carnivore = factory.CreateCarnivore();
            herbivore = factory.CreateHerbivore();
        } 
         
        public void RunFoodChain()
        { carnivore.Eat(herbivore); }

    }
原文地址:https://www.cnblogs.com/dragon-L/p/3685428.html