美文网首页工作生活
Abstract Factory抽象工厂模式

Abstract Factory抽象工厂模式

作者: _sands | 来源:发表于2019-07-02 17:51 被阅读0次

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

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

    案例

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


    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();
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:Abstract Factory抽象工厂模式

        本文链接:https://www.haomeiwen.com/subject/qtzpcctx.html