简单工厂模式不属于GoF的23种经典设计模式。
一、定义
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
在C#语言中,创建对象的四种方式:
1) 使用new关键字直接创建对象;
2) 使用反射机制创建对象;
3) 使用克隆方法创建对象;
4) 通过工厂类创建对象。
二、结构
(1)Factory(工厂类或工厂角色)
工厂类是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑。工厂类可以直接被外部调用,创建所需要的产品对象。
(2)Product(抽象产品类)
它是工厂类所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
(3)ConcreteProduct(具体产品类)
是简单工厂模式的创建目标,是创建的具体实例对象。
三、应用实例
抽象产品类Chart.cs
interfaceChart
{
voidDisplay();
}
具体产品类(包含HistogramChart.cs、PieChart.cs和LineChat.cs三个文件)
classHistogramChart : Chart
{
publicHistogramChart()
{
Console.WriteLine("创建柱状图");
}
publicvoidDisplay()
{
Console.WriteLine("显示柱状图");
}
}
classPieChart : Chart
{
publicPieChart()
{
Console.WriteLine("创建饼状图");
}
publicvoidDisplay()
{
Console.WriteLine("显示饼状图");
}
}
classLineChart : Chart
{
publicLineChart()
{
Console.WriteLine("创建折线图");
}
publicvoidDisplay()
{
Console.WriteLine("显示折线图");
}
}
工厂类(该类中要对类型进行判断)
classChartFactory
{
publicstaticChart GetChart(string type)
{
Chart chart = null;
if(type.Equals("histogram"))
{
chart = new HistogramChart();
Console.WriteLine("初始化设置柱状图");
}
elseif(type.Equals("pie"))
{
chart = new PieChart();
Console.WriteLine("初始化设置饼状图");
}
elseif(type.Equals("line"))
{
chart = new LineChart();
Console.WriteLine("初始化设置折线图");
}
returnchart;
}
}
客户端测试类(Program.cs文件)
classProgram
{
staticvoidMain(string[] args)
{
Chart chart;
chart = ChartFactory.GetChart("histogram");//通过静态工厂方法创建产品
chart.Display();
Console.Read();
}
}
说明:要在客户端进行操作时,每次都要修改成所需的类型。
四、简单工厂模式的优点
(1)工厂类包含必要的判断逻辑;实现了对象创建和使用的分离。
(2)客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。
(3)简单模式提高了灵活性。
五、简单工厂模式的缺点
(1)工厂类集中了所有产品的创建逻辑,职责过于繁重。
(2)简单工厂模式会增加系统中类的个数,增加了系统的复杂度和理解的难度。
(3)使得系统的扩展性降低。
(4)简单工厂模式中使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。C#语言中,不能通过类的实例对象来访问静态方法和静态变量。