zoukankan      html  css  js  c++  java
  • 抽象工厂模块在开发中的应用

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

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

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

     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)”

  • 相关阅读:
    Sitecore Digital Marketing System, Part 1: Creating personalized, custom content for site visitors(自定义SiteCore中的 Item的Personalize的Condition) -摘自网络
    Send email alert from Performance Monitor using PowerShell script (检测windows服务器的cpu 硬盘 服务等性能,发email的方法) -摘自网络
    使用Mono Cecil 动态获取运行时数据 (Atribute形式 进行注入 用于写Log) [此文报考 xxx is declared in another module and needs to be imported的解决方法]-摘自网络
    秒杀 ILSpy 等反编译利器 DotNet Resolver
    Nagios:企业级系统监控方案
    C# Asp.net中的AOP框架 Microsoft.CCI, Mono.Cecil, Typemock Open-AOP API, PostSharp -摘自网络 (可以利用反射 Attribute 进行面向切面编程 可以用在记录整个方法的Log方面)
    Windows性能监视器之CPU、硬盘、IO等监控方法详解-摘自网络
    网站防刷方案 -摘自网络
    利用XSD配合XSLT產出特定格式Word檔案 -摘自网络
    asp页面快速找到菜单按钮转向的页面的方法
  • 原文地址:https://www.cnblogs.com/lori/p/2150335.html
Copyright © 2011-2022 走看看