设计模式--工厂模式
简单工厂模式
简单工厂模式是指由一个工厂对象决定创建出哪一种类产品类的实例,但它不属于GOF 23种设计模式。简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。
简单工厂模式在JDK源码中也有很多使用,例如:Calendar类,LoggerFactory类种方法getLogger()。
缺点:工厂类的职责相对过重,不易于扩展过于复杂的产品结构。
工厂方法模式
工厂方法模式是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到实现类中进行。在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符合开闭原则。
工厂方法模式主要解决产品扩展的问题,在简单工厂中,随着产品链的丰富,如果每种汽车的创建逻辑有区别的话,工厂的职责会变的越来越多。
工厂方法适用于以下场景:
1、创建对象需要大量重复代码
2、客户端不依赖于产品类实例如何被创建、实现等细节
3、一个类通过其子类来指定创建哪个对象
工厂方法缺点:
1、类的个数容易过多,增加复杂度。
2、增加了系统的抽象性和理解难度。
抽象工厂模式
抽象工厂是指提供一个创建一系列或相互依赖对象的接口,无须指定他们具体的类。客户端不依赖于产品类实例如何被创建、实现等细节,强调的是一系列相关的对象一起使用创建对象需要大量重复的代码。需要提供一个产品类的库,使所有的产品以相同的接口出现,从而是客户端不依赖于具体实现。
实例代码:
public interface INote {
void edit();
}
public class ChineseNote implements INote{
@Override
public void edit() {
System.out.println("写笔记");
}
}
public abstract class CourseFactory {
public void init(){
System.out.println("初始化数据");
}
protected abstract INote createNote();
}
public class ChineseCourseFactory extends CourseFactory{
@Override
protected INote createNote() {
super.init();
return new ChineseNote();
}
}
public class Test {
public static void main(String[] args) {
ChineseCourseFactory factory = new ChineseCourseFactory();
factory.createNote().edit();
}
}
抽象工厂缺点:
1、规定了所有可能被创建的产品集合,扩展困难,需要修改抽象工厂的接口。
2、增加了系统的抽象和理解难度。
总结
- 简单工厂:唯一工厂类,一个产品抽象类,工厂类的创建方法依据入参判断并创建具体产品对象。
- 工厂方法:多个工厂类,一个产品抽象类,利用多态创建不同的产品对象,避免了大量的if-else判断。
- 抽象工厂:多个工厂类,多个产品抽象类,产品子类分组,同一个工厂实现类创建同组中的不同产品,减少了工厂子类的数量。
在下述情况下可以考虑使用工厂模式:
1、在编码时不能预见需要创建哪种类的实例。
2、系统不应依赖于产品类实例如何被创建、组合和表达的细节。
总之,工厂模式就是为了方便创建同一接口定义的具有复杂参数和初始化步骤的不同对象。工厂模式一般用来创建复杂对象。只需用new就可以创建成功的简单对象,无需使用工厂模式,否则会增加系统的复杂度。