设计模式之:抽象工厂模式AbstractFactoryPattern的实现
相比于工厂模式,抽象工厂模式的每个工厂可以创建产品系列,而不是一个产品;
抽象工厂用到的技术:接口、多态、配置文件、反射;
抽象工厂模式的设计原则:
- 实现客户端创建产品和使用产品的分离,客户端无须了解创建的细节,符合迪米特法则;
- 客户端面向接口定义产品,符合依赖倒置原则;
- 客户端面向接口定义工厂,而实际根据配置文件生成工厂实现类,符合里氏替换原则;
- 增加新的产品族时,无须修改原有代码,符合开闭原则;
- 使用配置文件,而不是硬编码方式指定创建的具体工厂,符合迪米特法则;
- 相较于简单工厂模式,抽象工厂中,一个工厂只负责某一产品系列的创建,而不是所有产品的创建,符合单一职责原则;
类图 with SartUML
工厂接口和两个实现类
internal interface SkinFactory
{
Button CreateButton();
TextField CreateTextField();
ComboBox CreateComboBox();
}
internal class SpringSkinFactory : SkinFactory
{
public Button CreateButton()
{
return new SpringButton();
}
public ComboBox CreateComboBox()
{
return new SpringComboBox();
}
public TextField CreateTextField()
{
return new SpringTextField();
}
}
internal class SummerSkinFactory : SkinFactory
{
public Button CreateButton()
{
return new SummerButton();
}
public ComboBox CreateComboBox()
{
return new SummerComboBox();
}
public TextField CreateTextField()
{
return new SummerTextField();
}
}
Button产品接口和两个实现类
internal interface Button
{
void Display();
}
internal class SpringButton : Button
{
public void Display()
{
Console.WriteLine("绿色按钮");
}
}
internal class SummerButton : Button
{
public void Display()
{
Console.WriteLine("蓝色按钮");
}
}
TextField产品的接口和两个实现类
internal interface TextField
{
void Display();
}
internal class SpringTextField : TextField
{
public void Display()
{
Console.WriteLine("绿色文本框");
}
}
internal class SummerTextField : TextField
{
public void Display()
{
Console.WriteLine("蓝色文本框");
}
}
ComboBox产品的接口和两个实现类
internal interface ComboBox
{
void Display();
}
internal class SpringComboBox : ComboBox
{
public void Display()
{
Console.WriteLine("绿色组合框");
}
}
internal class SummerComboBox : ComboBox
{
public void Display()
{
Console.WriteLine("蓝色组合框");
}
}
配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="factoryType" value="AbstractFactoryPattern.SpringSkinFactory"/>
</appSettings>
</configuration>
客户端
internal class Program
{
static void Main(string[] args)
{
//面向接口定义,使用多态,便于扩展
SkinFactory factory;
Button button;
TextField textField;
ComboBox comboBox;
//读取配置文件
string factoryType = ConfigurationManager.AppSettings["factoryType"];
//反射创建工厂对象
factory = Assembly.Load("AbstractFactoryPattern").CreateInstance(factoryType)as SkinFactory;
//工厂创建UI对象
button = factory.CreateButton();
textField = factory.CreateTextField();
comboBox = factory.CreateComboBox();
button.Display();
textField.Display();
comboBox.Display();
Console.Read();
}
}
运行结果: