什么是工厂模式?
工厂模式是一种对象创建型模式,顾名思义,它改变了对象新建这一步骤的方式,最直白的体现就是,我们正常情况下,新建一个对象时,采用:
User user=new User();
而在工厂模式中,我们通过调用工厂方法实现对象的创建。
简单工厂模式(静态工厂模式)
由一个工厂对象决定创建出哪一种产品类的实例。客户端只需要传入工厂类的参数,无需关心如何创建对象的细节
/**
* 简单的静态工厂
*/
public class FactoryPattern {
public static Goods createGoods(String type) {
if (type.equals("A")) {
//根据传入类型,创建对应类型的商品
return new GoodsA();
} else {
return null;
}
}
}
工厂方法模式(多态性工厂模式)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式是将对象的实例化延迟到其子类中进行,从而实现解耦。
public interface FactoryMethodPattern {
/**
* 定义创建方法,由子类实现,从而实现解耦
* @return
*/
public Goods createGoods();
}
子类实现
public class FactoryMethodPatternA implements FactoryMethodPattern{
@Override
public Goods createGoods() {
return new GoodsA();
}
}
调用时
FactoryMethodPattern factoryMethodPattern=new FactoryMethodPatternA();
Goods goods=factoryMethodPattern.createGoods();
抽象工厂模式
抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.
//提供多个抽象接口
public interface AbstractFactory {
Goods createGoods();
GoodsA createGoodsA();
}
接口实现上更加灵活
public class ConAbstractFactory implements AbstractFactory{
@Override
public Goods createGoods() {
return new GoodsA();
}
@Override
public GoodsA createGoodsA() {
return new GoodsA();
}
}
工厂模式的优缺点
优点
创建过程被统一化处理,实现了创建和使用的分离;
而抽象工厂和工厂方法模式在灵活性上更好,更便于维护扩展;
缺点
简单工厂模式灵活性较差,不利于扩展,新增新的对象就要修改代码;对象较多时,判断会很多,不利于维护;
工厂方法创建了更多的类,这在对象较多时,就需要更多的工厂来生产对应的对象;
抽象工厂方法可读性较差,因为类的关系上较为复杂。
工厂模式的应用场景
基于工厂模式的特点,我们可以总结出适用场景。
1.需要依赖具体环境创建不同实例,这些实例都有相同的行为,这时候我们可以使用工厂模式,简化实现的过程,同时也可以减少每种对象所需的代码量,有利于消除对象间的耦合,提供更大的灵活性;
2.系统中存在较大对象的强耦合关系时。
3.多个存在相同元素但又存在细节差异的对象的new方法。
那么,具体的应用场景由哪些呢?
资源管理:如文件资源、数据库资源、网络资源等等一类需要不同的创建方法的。
消息队列:当你需要在一个系统中使用不同的消息队列时。
日志记录:系统中可能存在多种类型的日志记录需求,这时候可以使用工厂模式。
还有很多实际的应用场景,可以多尝试,学会灵活应用才是王道,生搬硬套要不得。