工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。客户只需要从工厂中获取到所需要的实例对象即可,不再需要进行new操作。其实Spring中的IOC容器就可以看做是一个巨大的工厂类。
简单工厂模式
简单工厂模式(Simple Factory Pattern),是决定一个工厂类来决定创建一类特定的对象实例,不是GOF的23种设计模式。
在这种模式中,客户端只需要明确需要哪种对象实例即可,具体的创建过程这是交给了工厂类,客户端不需要关系内部的实现过程,对客户而言,调用更加简单,服务也可以有较好的扩展性。
简单示例
类图
有一份学习作业,但是他的种类很多,举出java作业和python作业为例,两个实现类,具有不同的doHomework()方法。
测试类
这样一来对于类似
private static void doHomework(IHomework homework){
homework.doHomework();
}
的方法可以不用修改就能完成功能的扩展。但是这种方式中,客户端直接依赖于工厂接口的实现类,虽说可以扩展,但是如果扩展量较大,则客户端的代码就会显得十分的臃肿,就目前而言,对象的创建不是很复杂,仅仅使用一个new的步骤即可,但是以后随着业务的扩展,相应的创建过程就会越来越复杂,这样一来,这种方式就不适合了。可以做相应的优化;
这样通过反射的方式,将具体的对象的创建过程封装起来,客户端直接和createHomework类交互即可,在后续的扩展时也不需要对该类修改,可控性也得到提高。
缺点
工厂类的职责过于繁重,不易于扩展复杂的结构。
工厂方法模式
工厂方法模式,指的是定义一个创建对象的接口,但是让这个接口的实现类来具体的决定创建什么对象。客户端只需要关心对象对应的工厂,无须关心创建细节。
工厂方法模式,解决的就是扩展的问题,对于简单的工厂模式而言,如果所需要的对象种类繁多,就会出现工厂的职责不断的扩充,不符合单一职责原则,而且也不便于进行高效的维护,各个实现类之间的关系复杂不好分,对客户端的调用也产生了一定代价。对于这个问题,我们可以建立分工厂,针对某一特定或一类的对象建立特定的工厂,具体的创建由对应的分工厂实现。
public class JavaFactory implements ICourseFactory {
@Override
public ICourse createCourse() {
return new JavaCourse();
}
}
public class PythonFactory implements ICourseFactory {
@Override
public ICourse createCourse() {
return new PythonCourse();
}
}
public interface ICourseFactory {
/**
*功能描述:创建课程实例对象,工厂方法模式
*/
ICourse createCourse();
}
适用场景
- 在创建一个对象时,需要大量的逻辑和数据的封装操作
- 客户端对对象的创建不关心
- 父类由其子类来创建对象
抽象工厂模式
这种模式提供一个创建一系列相关 的或者依赖的接口,不指定特定的具体类。一个对应的工厂可以创建相互联系的对象或者业务,这一系列的对象都被一个工厂封装,既能够进行扩展,又方便管理。
类图
简单来说,就是对于一类特定的对象可以通过特定的工厂创建,IFactory接口是对工厂的抽象。