一、简述
工厂模式有三种类型,分别为简单工厂、工厂方法和抽象工厂。
简单工厂模式:在工厂类中,根据条件决定一个接口是由那个具体的产品类来实现。
工厂方法:创建多个工厂类。各个工厂类中,都对应一个获得接口A实例的方法。用户决定使用哪个工厂。
抽象工厂:对工厂方法进行扩展。各个工厂类中,再增加一个获得接口B实例的方法。
1、简单工厂
概念
定义一个产品的接口或抽象类,其他产品类都实现或基础该接口或抽象类,再定一个工厂类,作用主要就是用来判断用户传递过来的条件产生不同的产品对象。简单的类图如下:
具体代码
首先定义一个产品的接口,例如如下:
public interface Operation {
int getResult(int a, int b);
}
让这些产品都实现该接口
public class OperationAdd implements Operation{
@Override
public int getResult(int a, int b) {
return a+b;
}
}
public class OperationSub implements Operation{
@Override
public int getResult(int a, int b) {
return a-b;
}
}
下面定义一个工厂类
public class OperationFactory {
public static Operation createOperation(String operate){
Operation operation = null;
switch (operate){
case "+":
operation = new OperationAdd();
case "-":
operation = new OperationAdd();
}
return operation;
}
}
以上即为一个简单工厂模式,客户端实例如下
public class TestMain {
public static void main(String[] args){
Operation operation = OperationFactory.createOperation("+");
int result = operation.getResult(1,3);
System.out.println(result);
}
}
总结
优点
1、当需要再次增加一个产品类的时候,不需要改动其他产品类,只需要增加本产品类即可。调用方不需要知道具体的产品类实现细节。
缺点
1、但是也需要设计到修改OperationFactory中的方法。这有些违背面向对象设计原则之一OCP(开闭原则);
2、工厂类很关键,如果工厂类出现问题,会导致整个程序出现问题。
2、工厂方法
概念
工厂方法其实是基于简单工厂之上,对于每种产品都增加对应工厂类,每个工厂类都实现或继承共同的工厂接口或抽象类。具体类图如下:
具体代码
首先定义一个产品的接口,例如如下:
public interface Operation {
int getResult(int a, int b);
}
让这些产品都实现该接口
public class OperationAdd implements Operation{
@Override
public int getResult(int a, int b) {
return a+b;
}
}
public class OperationSub implements Operation{
@Override
public int getResult(int a, int b) {
return a-b;
}
}
下面定义一个工厂类
public class OperationFactory {
public static Operation createOperation(String operate){
Operation operation = null;
switch (operate){
case "+":
operation = new OperationAdd();
case "-":
operation = new OperationAdd();
}
return operation;
}
}
以上即为一个简单工厂模式,客户端实例如下
public class TestMain {
public static void main(String[] args){
Operation operation = OperationFactory.createOperation("+");
int result = operation.getResult(1,3);
System.out.println(result);
}
}
总结
优点
1、当需要再次增加一个产品类的时候,不需要改动其他产品类,只需要增加本产品类即可。调用方不需要知道具体的产品类实现细节。
缺点
1、但是也需要设计到修改OperationFactory中的方法。这有些违背面向对象设计原则之一OCP(开闭原则);
2、工厂类很关键,如果工厂类出现问题,会导致整个程序出现问题。
3、抽象工厂
抽象工厂模式比工厂方法又复杂一层,主要是为了解决当存在多个不同的抽象产品时的情况,即当有多个产品接口或产品抽象类时,每一个工厂类可以创建多个产品,同时所有的工厂类又拥有同一个抽象工厂类。抽象工厂模式针对的是多个产品等级结果。具体类图如下:
具体代码
根据类图,相信脑海中能够构造出对应的代码,此处就不再粘贴大段代码。
总结
优点
1、当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
缺点
1、当增加某一类型的产品的时候,这就涉及到需要修改抽象工厂类,从而涉及到需要修改抽象工厂类下的所有子类。
参考文献
《大话设计模式》