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();
            }
        }
    }
    
  • 相关阅读:
    javascript无提示关闭窗口,兼容IE,Firefox
    vbs简单制作U灵大盗带发送功能的代码
    正则表达式提取网址、标题、图片等一例(.Net Asp Javascript/Js)的实现
    在asp.net中保持Session的有效期
    批处理编程 介绍
    IIS日志清理CMD版,VBS版,JS版,WSH版
    正则表达式提取图片地址
    用U盘安装GNU/Linux
    三核浏览器Lunascape新版发布
    黑客基础之DOS(最齐全)
  • 原文地址:https://www.cnblogs.com/sands/p/11460160.html
Copyright © 2011-2022 走看看