抽象工厂模式:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。{创建型模式}
抽象工厂模式以一种倾斜的方式支持增加,可以很容易的增加产品族,但是不能为增加产品等级结构提供方便。[如下图,我们可以很容易的纵向的系统,但是添加横向的控件确不易]
实现代码如下:
namespace AbstractN
{
//AbstractFactory
abstract public class ViewFactory
{
abstract public Button makeButton();
abstract public TextBox makeTextBox();
}
//ConcreteFactory1
public class WindowsView : ViewFactory
{
public override Button makeButton()
{
return new WindowsXPButton();
}
public override TextBox makeTextBox()
{
return new WindowsXPTextBox();
}
}
//ConcreteFactory2
public class UnixView : ViewFactory
{
public override Button makeButton()
{
return new UnixAixButton();
}
public override TextBox makeTextBox()
{
return new UnixAixTextBox();
}
}
//AbstractProductA
abstract public class Button
{
abstract public void ButtonName(string name);
abstract public void ButtonSize();
}
//AbstractProductB
abstract public class TextBox
{
abstract public double TextboxLen();
}
//ProductA1
public class WindowsXPButton : Button
{
public override void ButtonName(string name)
{
Console.WriteLine("Xp系统的按钮默认名:" + name);
}
public override void ButtonSize()
{
Console.WriteLine("按钮尺寸可调整!");
}
}
//ProductA2
public class UnixAixButton : Button
{
public override void ButtonName(string name)
{
Console.WriteLine("AIX系统的按钮默认名:" + name);
}
public override void ButtonSize()
{
Console.WriteLine("按钮尺寸不调整!");
}
}
//ProductB1
public class WindowsXPTextBox : TextBox
{
public override double TextboxLen()
{
return 12.9;
}
}
//ProductB2
public class UnixAixTextBox : TextBox
{
public override double TextboxLen()
{
return 19.2;
}
}
//Client端----------------------------
public class Client
{
Button button;
TextBox textbox;
public Client(ViewFactory system)
{
button = system.makeButton();
textbox = system.makeTextBox();
}
public void showAllView()
{
button.ButtonName("按钮名称");
button.ButtonSize();
Console.WriteLine(textbox.TextboxLen().ToString());
}
}
class Program
{
static void Main(string[] args)
{
ViewFactory v = new WindowsView();
Client client = new Client(v);
client.showAllView();
ViewFactory v1 = new UnixView();
Client c1 = new Client(v1);
c1.showAllView();
}
}
}
我们以后在增加/替换系统的时候,可以增加一些DLL,切换相关的引用;
但是在增加控件的时候,类库项目和Client端的变动都较大。