一、定义
提供一个创建一系列相关或互相依赖对象的接口,而无须指定他们具体的类,抽象工厂模式是一种创建型模式。
二、描述
抽象工厂比工厂方法的抽象程度更高,通过引入了工厂等级结构,解决了简单工厂模式中工厂类职责太重的原则。为了更好的理解抽象工厂模式,引入两个概念:
1、产品等级结构:指不同品牌的同一类型产品,如:小米电视机、海信电视机、索尼电视机
2、产品族:指同一品牌的不同了类型产品,如:小米电视机、小米手机、小米电脑
抽象工厂模式中的每个具体工厂提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成了一个产品族,它包含以下四个角色:
1、AbstractFactory (抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
2、ConcreteFactory (具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
3、AbstractProduct (抽象产品角色):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
4、ConcreteProduct (具体产品角色):它定义具体工厂生产的具体产品对象,实现在抽象产品接口中声明的业务方法。
三、例子
X公司要开发一套皮肤库,可切换不同风格,如春天风格,用浅绿色按钮、文本框等,夏天用浅蓝色的,后续还可以增加其他风格。
抽象产品接口:Button、TextField、ComboBox
public interface IButton
{
void Display();
}
public interface ITextField
{
void Display();
}
public interface IComboBox
{
void Display();
}
具体产品类:
SpringButton、SpringTextField、SpringComboBox,Spring风格按钮、文本框、组合框
SummerButton、SummerTextField、SummerComboBox,Summer风格按钮、文本框、组合框
public class SpringButton : IButton
{
public void Display()
{
Console.WriteLine("显示浅绿色按钮。");
}
}
public class SpringTextField : ITextField
{
public void Display()
{
Console.WriteLine("显示绿色边框文本框。");
}
}
public class SpringComboBox : IComboBox
{
public void Display()
{
Console.WriteLine("显示绿色边框下拉框。");
}
}
public class SummerButton : IButton
{
public void Display()
{
Console.WriteLine("显示浅绿色按钮。");
}
}
public class SummerTextField : ITextField
{
public void Display()
{
Console.WriteLine("显示绿色边框文本框。");
}
}
public class SummerComboBox : IComboBox
{
public void Display()
{
Console.WriteLine("显示绿色边框下拉框。");
}
}
抽象皮肤工厂接口:ISkinFactory
public interface ISkinFactory
{
IButton CreateButton();
ITextField CreateTextField();
IComboBox CreateComboBox();
}
具体皮肤工厂类:SpringSkinFactory、SummerSkinFactory
public class SpringSkinFactory : ISkinFactory
{
public IButton CreateButton()
{
return new SpringButton();
}
public IComboBox CreateComboBox()
{
return new SpringComboBox();
}
public ITextField CreateTextField()
{
return new SpringTextField();
}
}
public class SummerSkinFactory : ISkinFactory
{
public IButton CreateButton()
{
return new SummerButton();
}
public IComboBox CreateComboBox()
{
return new SummerComboBox();
}
public ITextField CreateTextField()
{
return new SummerTextField();
}
}
Program:测试代码
Console.WriteLine("加载Spring皮肤\n");
ISkinFactory skinFactory = new SpringSkinFactory();
IButton button = skinFactory.CreateButton();
ITextField textField = skinFactory.CreateTextField();
IComboBox comboBox = skinFactory.CreateComboBox();
button.Display();
textField.Display();
comboBox.Display();
Console.ReadLine();
四、总结
如果需要增加新的产品族很方便,无需修改已有系统,符合开闭原则,但是如果需要增加产品等级结构,会非常麻烦,比如单选按钮(RadioButton),因为抽象工厂ISkinFactory根本没有提供创建的方法,需要依次修改抽象工厂接口、具体皮肤工厂类,抽象工厂模式无法很好的解决此类问题,这也是该模式最大的缺点,所以不适合在产品等级结构不稳定的场景下使用。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容