工厂类虽然快捷方便和易于扩展,但是每一个具体工厂类只能生产一类产品。如果需要多组的产品类,则系统中就会存在大量的工厂类,会增加系统资源的消耗。
抽象工厂模式就可以很好的解决这种问题。
1.抽象工厂模式概述:
—>抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。
如果现在有3个空间:Button , TextBox 和RadioBox。 我们需要为它们设计两种风格的皮肤,如果使用工厂模式,我们就需要设计很多工厂类。但如果我们使用抽象模式就只需要设计2个工厂类和一个抽象工厂类即可。
1.定义控件接口
public interface Button
{
void BtnDisplay();
}
public interface TextBox
{
void TxtDisplay();
}
public interface RadioBox
{
void RdoDisplay();
}
2.实现这些空间的两种风格:
public class SpringButton : Button
{
public void BtnDisplay()
{
Console.WriteLine("浅绿色按钮。。。");
}
}
public class SummerButton : Button
{
public void BtnDisplay()
{
Console.WriteLine("浅蓝色按钮。。。");
}
}
public class SpringTextBox : TextBox
{
public void TxtDisplay()
{
Console.WriteLine("浅绿色文本框。。。");
}
}
public class SummerTextBox : TextBox
{
public void TxtDisplay()
{
Console.WriteLine("浅蓝色文本框。。。");
}
}
public class SpringRadioBox : RadioBox
{
public void RdoDisplay()
{
Console.WriteLine("浅绿色单选框。。。");
}
}
public class SummerRadioBox : RadioBox
{
public void RdoDisplay()
{
Console.WriteLine("浅蓝色的单选框。。。");
}
}
3.定义工厂接口:
public interface Factory
{
Button GetButton();
TextBox GetTextBox();
RadioBox GetRadioBox();
}
4.实现两种风格的工厂类:
public class SpringFactory : Factory
{
public Button GetButton()
{
return new SpringButton();
}
public TextBox GetTextBox()
{
return new SpringTextBox();
}
public RadioBox GetRadioBox()
{
return new SpringRadioBox();
}
}
public class SummerFactory : Factory
{
public Button GetButton()
{
return new SummerButton();
}
public TextBox GetTextBox()
{
return new SummerTextBox();
}
public RadioBox GetRadioBox()
{
return new SummerRadioBox();
}
}
5.测试代码:
static void Main(string[] args)
{
Factory fa;
Button btn;
TextBox txt;
RadioBox rad;
fa = new SpringFactory();
btn = fa.GetButton();
txt = fa.GetTextBox();
rad = fa.GetRadioBox();
btn.BtnDisplay();
txt.TxtDisplay();
rad.RdoDisplay();
Console.ReadLine();
}
总结:
—>虽然抽象工厂类可以很方便的创建一组产品族,但是如果再添加一个新控件就需要修改源代码。