简单工厂设计模式不属于23种设计模式,但通过它可以更好的学习工厂方法设计模式和抽象工厂设计模式。
简单工厂设计模式流程:
1)将需要的不同对象的相关代码封装到不同的类中,这些类成为产品类。
2)将它们相同的代码封装到一个抽象类产品类中,每一个产品类都是这个抽象产品类的子类
3)最后提供一个工厂类,在工厂类中提供一个(或多个)创建产品的工厂方法,该方法可以通过传入的对象返回不同的产品对象。
—>创建抽象产品类
interface Chart
{
void Display();
}
—>产品类继承自抽象产品类
class HistogramChart : Chart
{
public HistogramChart()
{
Console.WriteLine("创建柱状图。。。");
}
public void Display()
{
Console.WriteLine("打印柱状图。。。");
}
}
class PieChart : Chart
{
public PieChart()
{ Console.WriteLine("创建饼状图。。。"); }
public void Display()
{
Console.WriteLine("打印饼状图。。。");
}
}
class LineChart : Chart
{
public LineChart()
{
Console.WriteLine("创建折线图。。。");
}
public void Display()
{
Console.WriteLine("打印折线图。。。。");
}
}
—>工厂类主要需要一个静态方法,根据传入的参数决定返回具体的产品类对象
class ChartFactory
{
//工厂类必须需要一个静态方法
public static Chart GetChart(string type)
{
Chart chart = null;
switch (type.ToLower())
{
case "histogram":
chart = new HistogramChart();
break;
case "pie":
chart = new PieChart();
break;
case "line":
chart = new LineChart();
break;
default:
break;
}
return chart;
}
}
任何工厂类都强调一点:如果有两个类A和B,那么只能A创建B或A使用B,不能将创建职责和使用职责放在同一个类中。
简化工厂模式:我们可以把工厂类的静态方法放在产品抽象类中:
abstract class Product
{
abstract public void Display();
public static Product FactoryMethod(int arg)
{
if (arg == 0)
return new ConcreteProductA();
else
return new ConcreteProductB();
}
}
class ConcreteProductA : Product
{
public ConcreteProductA()
{
Console.WriteLine("A创建中。。。");
}
public override void Display()
{
Console.WriteLine("A打印中。。。");
}
}
class ConcreteProductB : Product
{
public ConcreteProductB()
{
Console.WriteLine("B创建中。。。");
}
public override void Display()
{
Console.WriteLine("B打印中。。。");
}
}