工厂,顾名思义就是用来生产产品的地方。而在设计模式中提到的工厂是什么意思呢?设计模式中提到了三种工厂模式:简单工厂模式、抽象工厂模式、工厂方法模式,他们有什么共同点和区别呢?下边就来总结一下设计模式中的工厂家族
1 简单工厂模式
1.1定义:
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
1.2 UML类图
抽象产品:这里的抽象产品可以是抽象类也可以是接口
具体产品:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
工厂角色:这是简单工厂的核心部分,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
1.3 UML实例
首先写出运算类(这是一个抽象类),他有两个Number属性,有一个GetResult的虚方法,用于得到结果。加减乘除是它的子类,继承他后,重写GetResult方法(因为是抽象类只提供虚方法,每个子类的方法各部不相同,所以需要对继承父类的方法进行重写)。而简单工厂的作用是:作为一个单独的类去实现子类的实例化过程。
运算类:
class Operation //运算类
{
private double _numberA = 0;
private double _numberB = 0;
public double NumberA
{
get { return _numberA; }
set { _numberA = value; }
}
public double NumberB
{
get { return _numberB; }
set { _numberB= value; }
}
public virtual double GetResult() //vitual 用来声明虚方法,可被子类重写
{
double result=0;
return result;
}
加法类(其余三个雷同,省略)
class OperationAdd:Operation //加法类
{
public override double GetResult() //对父类方法进行重写
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
简单工厂类:
class OperationFactory
{
public static Operation createOperate(string operate) // createOperate是静态方法,返回值是Operation,不需要实例化对象就可以使用
{
Operation oper = null;
switch (operate )
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case"/":
oper = new OperationDiv();
break;
}
return oper;
}
}
客户端
Operation oper;
oper = OperationFactory.createOperate("-");
oper.NumberA = 1;
oper.NumberB = 3;
double result = oper.GetResult();
1.4 应用场景
1.5 自己的理解
简单工厂就是给他传进去原材料,他就可以生产出客户需要的产品,而客户并不需要知道这个产品是如何生产的。例如去餐厅点餐,餐厅就相当于是一个简单工厂,食品看做抽象类,宫保鸡丁,鱼香肉丝等等是具体的产品,你要什么,他就会生产出什么,而你不需要知道他是怎么做出来的。
总结一句话:简单工厂将消费者与建造者分离,有利于系统的优化。但是因为只有一个工厂类,所有的逻辑判断都集中在在这一个类中,如果他不能正常工作就会影响到客户端。
2 工厂方法
2.1定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个实例化延迟到子类
2.2 UML图
2.3 UML实例
工厂接口:
interface IFactory
{
Operation CreateOpertation(); //唯一的一个方法就是创建产品对应的工厂类
}
具体工厂类:(加法:其他雷同就不贴了)
class AddFactory:IFactory
{
public Operation CreateOperation() //加法类工厂,去实现IFactory接口
{
return new OperationAdd();
}
}
客户端:
IFactory operFactory = new AddFactory();
Operation oper = operFactory.CreateOpertation();
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
2.4 应用场景
A:对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
B:只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。(来自百科)
2.5 自己的理解
工厂方法是简单工厂进一步的抽象,把工厂类抽象成一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。所有要生产具体类的工厂,就去实现这个接口。原来简单工厂只是对产品抽象出一个产品类,让具体产品去继承,现在我们把工厂类也进行了抽象,派生出多个具体的工厂类,这样在增加功能使,就不会对原来的工厂类直接进行修改,而是扩展出一个新的工厂子类。