• 抽象工厂模块在开发中的应用


    抽象工厂是设计模块中创建型模式的一种,它比起工厂方法模式来说,更加具有一般性,在本模式中会引入一个产品族的概念,就是说,在本模式中抽象产品会有多个,然后用抽象工厂去调用它们,具体怎么去调用由具体工厂来实现。

    看下列代码,主要实现动态生成按钮和弹出窗口的功能,弹出窗口可以根据浏览器的类型去调用适合

    自己的方法,按钮也可以根据传入的样式和类型去自动生成按钮。

     class Program
        {
            static void Main(string[] args)
            {
                RunEnvironment run=new RunEnvironment (new RedFactory());
                Console.WriteLine(run.Button.ToHtml(ButtonType.Button,"name1"));
            }
        }
        #region WindowOpen的抽象产品和具体产品
        public abstract class WindowOpen
        {
            protected WindowOpen(string title)
            {
                Title = title;
            }
            protected string Title { get; set; }
            public abstract string ToHtml(string url);
        }
        public class IeWindowOpen : WindowOpen
        {
            public IeWindowOpen()
                : base("IE")
            {
     
            }
            public override string ToHtml(string url)
            {
                return string.Format("<script>Window.open('','{0}','')", url);
            }
        }
        public class FireFoxWindowOpen : WindowOpen
        {
            public FireFoxWindowOpen()
                : base("火狐")
            {
     
            }
            public override string ToHtml(string url)
            {
                return string.Format("<script>Window.open('','{0}','')", url);
     
            }
        }
        #endregion
     
        #region Button的抽象产品和具体产品
        /// <summary>
        /// 按钮类型
        /// </summary>
        public enum ButtonType
        {
            Submit,
            Button,
            Reset,
        }
        public abstract class Button
        {
            protected Button(string className)
            {
                ClassName = className;
            }
            protected string ClassName { get; set; }
            public abstract string ToHtml(ButtonType buttonType, string id);
        }
        public class RedButton : Button
        {
            public RedButton()
                : base("Redbtn")
            {
     
            }
            public override string ToHtml(ButtonType buttonType, string id)
            {
                return string.Format("<input id='{2}' name='{2}' type='{0}' class='{1}' />",
                              Enum.GetName(typeof(ButtonType), buttonType), ClassName, id);
            }
        }
     
        public class GreenButton : Button
        {
            public GreenButton()
                : base("GreenBtn")
            {
     
            }
            public override string ToHtml(ButtonType buttonType, string id)
            {

    return string.Format("<input id='{2}' name='{2}' type='{0}' class='{1}' />",

    Enum.GetName(typeof(ButtonType), buttonType), ClassName, id);

            }
        }
        #endregion
     
        #region 抽象工厂和具体工厂
        public abstract class Factory
        {
            public abstract WindowOpen CreateWindowOpen();
            public abstract Button CreateButton();
        }
        public class GreenFactory : Factory
        {
            public override Button CreateButton()
            {
                return new GreenButton();
            }
            public override WindowOpen CreateWindowOpen()
            {
                return new IeWindowOpen();
            }
        }
     
        public class RedFactory : Factory
        {
            public override Button CreateButton()
            {
                return new RedButton();
            }
            public override WindowOpen CreateWindowOpen()
            {
                return new IeWindowOpen();
            }
        }
     
        #endregion
     
        #region 应用环境
        public class RunEnvironment
        {
            public WindowOpen WindowOpen { get; set; }
            public Button Button { get; set; }
            public RunEnvironment(Factory factory)
            {
                this.WindowOpen =  factory.CreateWindowOpen();
                this.Button = factory.CreateButton();
            }
        
        }
        #endregion

    看到上面代码后,如果我们想为按钮加一个黄色的样式,我要示从Button类派生一个子类,去实现

    黄色样式功能就可以了,而不需要修改已有的代码,这也很好的符合的“开闭原则(OCP)”

  • 相关阅读:
    RedisTemplate的rightpushAll()时的坑
    Redis操作HyperLogLog
    Redis做消息队列使用
    UML
    设计模式概述
    HTTP/HTTPS/TCP/IP协议
    SpringBoot特点
    虚拟机+kafka基础配置
    Spring学习
    SpringBoot配置文件
  • 原文地址:https://www.cnblogs.com/lori/p/2150335.html
Copyright © 2020-2023  润新知