人人都是产品经理 2018-03-14
转载自:http://blog.csdn.net/lovelion 作者:刘伟
Sunny软件公司的开发人员针对上述要求,决定使用工厂方法模式进行系统的设计,为了保证系统的灵活性和可扩展性,
提供一系列具体工厂来创建按钮、文本框、组合框等界面元素,客户端针对抽象工厂编程,初始结构如图2所示:

在图2中,提供了大量工厂来创建具体的界面组件,可以通过配置文件更换具体界面组件从而改变界面风格。
但是,此设计方案存在如下问题:
(1)当需要增加新的皮肤时,虽然不要修改现有代码,但是需要增加大量类,
针对每一个新增具体组件都需要增加一个具体工厂,
类的个数成对增加,这无疑会导致系统越来越庞大,增加系统的维护成本和运行开销;
(2)由于同一种风格的具体界面组件通常要一起显示,因此需要为每个组件都选择一个具体工厂,
用户在使用时必须逐个进行设置,如果某个具体工厂选择失误将会导致界面显示混乱,
虽然我们可以适当增加一些约束语句,但客户端代码和配置文件都较为复杂。
如何减少系统中类的个数并保证客户端每次始终只使用某一种风格的具体界面组件?
这是Sunny公司开发人员所面临的两个问题,显然,工厂方法模式无法解决这两个问题,抽象工厂模式可以让这些问题迎刃而解。
使用抽象工厂模式来重构界面皮肤库的设计,其基本结构如图

SkinFactory接口充当抽象工厂
其子类SpringSkinFactory和SummerSkinFactory充当具体工厂
接口Button、Text和ComboBox充当抽象产品
其子类SpringButton、SpringText、SpringComboBox和SummerButton、SummerText、SummerComboBox充当具体产品。
完整代码如下所示:
SkinFactory:
abstract class SkinFactory
{
//创建按钮
public abstract Button CreateButton();
//创建文本框
public abstract Text CreateText();
//创建组合框
public abstract Combox CreateCombox();
}SpringSkinFactory:
class SpringSkinFactory : SkinFactory
{
public override Button CreateButton()
{
return new SpringButton();
}
public override Combox CreateCombox()
{
return new SpringCombox();
}
public override Text CreateText()
{
return new SpringText();
}
}SummerSkinFactory:
class SummerSkinFactory : SkinFactory
{
public override Button CreateButton()
{
return new SummerButton();
}
public override Combox CreateCombox()
{
return new SummerCombox();
}
public override Text CreateText()
{
return new SummerText();
}
}Button:
abstract class Button
{
public abstract void Display();
}SpringButton:
class SpringButton : Button
{
public override void Display()
{
Console.WriteLine("显示浅绿色按钮_春天");
}
}SummerButton:
class SummerButton : Button
{
public override void Display()
{
Console.WriteLine("显示浅蓝色按钮_夏天");
}
}Text:
abstract class Text
{
abstract public void Display();
}SpringText:
class SpringText : Text
{
public override void Display()
{
Console.WriteLine("显示绿色文本框_春天");
}
}SummerText:
class SummerText : Text
{
public override void Display()
{
Console.WriteLine("显示蓝色文本框_夏天");
}
}Combox:
abstract class Combox
{
public abstract void Display();
}SpringCombox:
class SpringCombox : Combox
{
public override void Display()
{
Console.WriteLine("显示绿色组合框_春天");
}
}SummerCombox:
class SummerCombox : Combox
{
public override void Display()
{
Console.WriteLine("显示蓝色组合框_夏天");
}
}Program:
namespace AbstractFactory
{
class Program
{
static void Main(string[] args)
{
//创建个SringSkin
SkinFactory skin = new SpringSkinFactory();
Button springBtn = skin.CreateButton();
Text springText = skin.CreateText();
Combox springCombox = skin.CreateCombox();
springBtn.Display();
springText.Display();
springCombox.Display();
Console.Read();
}
}
}运行结果如下: