• 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();
            }
        }
    }
    
  • 相关阅读:
    C#中HashTable的用法
    JS、C#编码解码
    javascipt取整数四舍五入
    Oracle中的不等于号
    MD5加密函数
    汉字转成拼音
    按日期生成惟一的编号
    将access数据转换成oracle数据
    TOAD Menu Shortcuts 快捷键
    请求方法总结
  • 原文地址:https://www.cnblogs.com/sands/p/11460160.html
Copyright © 2020-2023  润新知