Abstract Factory抽象工厂模式

抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式。

目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法)。
使用场景:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
实现:在一个工厂里聚合多个同类产品。

案例

上一个工厂方法模式的案例是 一家生产电子产品的工厂,可以生产各种电子产品,但是这时候集团还拥有一家生产服装的工厂,
怎么能把这两个工厂给管理起来,其实把公产管理起来这样更加有助于去理解业务中的类的组织管理,不至于混乱不清晰。
image.png

namespace DesignPatterns.AbstractFactory
{
    /// <summary>
    /// 抽象工厂
    /// </summary>
    public abstract class AbstractFactory
    {
        public virtual ElectronicProduct GetElectronicProduct(string name)
        {
            throw new NullReferenceException();
        }
        public virtual CarProduct GetCarProduct(string name)
        {
            throw new NullReferenceException();
        }
    }
    /// <summary>
    /// 抽象工厂生成器,抽象工厂的调用入口
    /// </summary>
    public class FactoryProducer
    {
        /// <summary>
        /// 根据名称获取子类工厂的实例
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static AbstractFactory GetFactory(string name)
        {
            if (name.ToLower() == "car")
                return new CarFactory();
            if (name.ToLower() == "electronic")
                return new ElectronicFactory();
            return null;
        }
    }


    #region 子类工厂 实现抽象工厂的方法
    public class CarFactory : AbstractFactory
    {
        public override CarProduct GetCarProduct(string name)
        {
            if (name.ToLower() == "motorbike")
                return new Motorbike();
            if (name.ToLower() == "xpandrally")
                return new XpandRally();
            throw new Exception("unknow product name");
        }
    }

    public class ElectronicFactory : AbstractFactory
    {
        public override ElectronicProduct GetElectronicProduct(string name)
        {
            if (name.ToLower() == "tv")
                return new TV();
            if (name.ToLower() == "mp4")
                return new MP4();
            if (name.ToLower() == "mp3")
                return new MP3();
            throw new Exception("unknow product name");
        }
    }

    #endregion

    #region 子类工厂的产品

    public abstract class CarProduct
    {
        public abstract void Run();
    }

    public class Motorbike : CarProduct
    {
        public override void Run()
        {
            Console.WriteLine("摩托车");
        }
    }

    public class XpandRally : CarProduct
    {
        public override void Run()
        {
            Console.WriteLine("拉力赛车");
        }
    }


    public abstract class ElectronicProduct
    {
        public abstract void Play();
    }

    public class TV : ElectronicProduct
    {
        public override void Play()
        {
            Console.WriteLine("TV play");
        }
    }

    public class MP4 : ElectronicProduct
    {
        public override void Play()
        {
            Console.WriteLine("MP4 play");
        }
    }

    public class MP3 : ElectronicProduct
    {
        public override void Play()
        {
            Console.WriteLine("MP3 play");
        }
    }

    #endregion


    public class AbstractFactoryTest
    {
        public static void Test()
        {
            //实例化造车工厂
            AbstractFactory carFactory = FactoryProducer.GetFactory("car");
            //获取摩托车实例
            var motorbike = carFactory.GetCarProduct("motorbike");
            //执行实例方法
            motorbike.Run();
            //实例化电子厂
            AbstractFactory electronicFactory = FactoryProducer.GetFactory("electronic");
            //获取tv实例
            var tv = electronicFactory.GetElectronicProduct("tv");
            tv.Play();
        }
    }
}
posted @ 2019-09-04 16:57  sands  阅读(147)  评论(0编辑  收藏  举报