抽象工厂模块在开发中的应用
抽象工厂是设计模块中创建型模式的一种,它比起工厂方法模式来说,更加具有一般性,在本模式中会引入一个产品族的概念,就是说,在本模式中抽象产品会有多个,然后用抽象工厂去调用它们,具体怎么去调用由具体工厂来实现。
看下列代码,主要实现动态生成按钮和弹出窗口的功能,弹出窗口可以根据浏览器的类型去调用适合
自己的方法,按钮也可以根据传入的样式和类型去自动生成按钮。
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)”
分类:
其它 / 系统架构
, 其它 / ASP.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示