zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
    
  • 相关阅读:
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31
    知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  • 原文地址:https://www.cnblogs.com/sands/p/11460160.html
Copyright © 2011-2022 走看看