工厂模式
2020-04-19 本文已影响0人
上吧鲤鱼王
在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。
1、简单工厂模式
定义:定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。
类图

代码实现
public class ShapeFactory {
private String type;
public ShapeFactory() {
}
public ShapeFactory(String type) {
this.type = type;
}
public void setType(String type) {
this.type = type;
}
public Shape getInstance() {
if ("circle".equals(type)) {
return new Circle();
} else if ("square".equals(type)) { //增加正方形这里修改一处,但不是类扩展,不符合开闭原则:对修改关闭,对扩展开放
return new Square();
}
return null;
}
}
public class Client {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory("circle");
//画圆
shapeFactory.getInstance().draw();
//增加正方形
shapeFactory.setType("square");
shapeFactory.getInstance().draw();
}
}
适用场景:
其实由定义也大概能推测出其使用场景,首先由于只有一个工厂类,所以工厂类中创建的对象不能太多,否则工厂类的业务逻辑就太复杂了,其次由于工厂类封装了对象的创建过程,所以客户端应该不关心对象的创建。总结一下适用场景:
(1)需要创建的对象较少。
(2)客户端不关心对象的创建过程。
总结:全部产品都由一个工厂生产,依靠类型判断生产哪种产品,特点是简单,缺点是不好扩展,违反开闭原则。
2、工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
类图

适用场景:
(1)客户端不需要知道它所创建的对象的类。
(2)客户端可以通过子类来指定创建对应的对象。
总结:有一个工厂的接口,产品的实例化由其子类完成,想生产哪种产品就创建哪种产品的子类,符合开闭原则。
3、抽象工厂模式
定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。( 在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的对象)
类图

适用场景:
(1)和工厂方法一样客户端不需要知道它所创建的对象的类。
(2)需要一组对象共同完成某种功能时。并且可能存在多组对象完成不同功能的情况。
(3)系统结构稳定,不会频繁的增加对象。(因为一旦增加就需要修改原有代码,不符合开闭原则)
总结:针对产品族(如代码中的BenzSUVCar,BenzMPVCar为一产品族),工厂方法模式可以看成是只生成一种产品的抽象工厂。抽象支持增加产品族,不支持增加产品。
Mybatis中的工厂模式
SqlSession就是使用了工厂方法模式创建,SqlSessionFactory定义了创建SqlSession的接口,SqlSession的实例化是在子类完成,并且我们使用时并不用需要关心SqlSession的创建过程。
public interface SqlSessionFactory {
SqlSession openSession();
...
}
