抽象工厂模块在开发中的应用
抽象工厂是设计模块中创建型模式的一种,它比起工厂方法模式来说,更加具有一般性,在本模式中会引入一个产品族的概念,就是说,在本模式中抽象产品会有多个,然后用抽象工厂去调用它们,具体怎么去调用由具体工厂来实现。
看下列代码,主要实现动态生成按钮和弹出窗口的功能,弹出窗口可以根据浏览器的类型去调用适合
自己的方法,按钮也可以根据传入的样式和类型去自动生成按钮。
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,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件