前言
在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不同的分配方案。
工厂方法模式
工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”
根据定义可以知道,工厂方法模式的实质是定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。类的实例在子类中进行。
首先创建一个创建对象的接口ProgrammeFactory
public interface ProgrammeFactory {
Video getVideo();
}
只有一个方法用于获取各类语言的教学视频,再定义两个子类去实现它
// 获取Java语言的教学视频
public class JavaProgrammeFactory implements ProgrammeFactory {
@Override
public Video getVideo() {
System.out.println("获取Java视频教程");
return new JavaVideo();
}
}
// 获取Python语言的教学视频
public class PythonProgrammeFactory implements ProgrammeFactory {
@Override
public Video getVideo() {
System.out.println("获取Python视频教程");
return new PythonVideo();
}
}
测试代码
public class FactoryMethodDemo {
public static void main(String[] args) {
ProgrammeFactory factory = new JavaProgrammeFactory();
factory.getVideo();
factory = new PythonProgrammeFactory();
factory.getVideo();
}
}
工厂方法模式适用场景:
- 创建对象需要大量重复代码
- 客户端(应用层)不依赖与产品类实例如何被创建、实现等细节
- 一个类通过其子类来指定创建哪个对象
工厂方法模式优点:
- 用户只需关心所需要产品对应的工厂,无需关心创建的细节
- 加入新产品符合开闭原则,提供可扩展性
工厂方法模式缺点:
- 类的个数容易过多,增加复杂性
- 增加了系统的抽象性和理解难度
完整代码:工厂方法模式
抽象工厂模式
抽象工厂模式(英语:Abstract factory pattern)是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。
抽象工厂模式主要用来解决产品族的问题。比如工厂模式中提到的两种语言,不止有教学视频,还有文章等,如此一来,就可以分为:Java视频、Java文章、Python视频、Python文章四种产品。其中Java视频和Java文章属于同一产品族,Python视频和Python文章属于同一产品族。而Java视频和Python视频属于不同产品族的同一产品等级,Java文章和Python文章也是如此。这时便要用到抽象工厂模式
首先创建一个创建对象的接口ProgrammeFactory
public interface ProgrammaFactory {
Video getVideo();
Article getArticle();
}
有两个方法用于获取视频教程和文章教程(同一产品族),再定义两个子类去实现它
// 获取Java产品族的工厂
public class JavaProgrammaFactory implements ProgrammaFactory {
public Video getVideo() {
System.out.println("获取Java视频教程");
return new JavaVideo();
}
public Article getArticle() {
System.out.println("获取Java文章教程");
return new JavaArticle();
}
}
// 获取Python产品族的工厂
public class PythonProgrammaFactory implements ProgrammaFactory {
public Video getVideo() {
System.out.println("获取Python视频教程");
return new PythonVideo();
}
public Article getArticle() {
System.out.println("获取Python文章教程");
return new PythonArticle();
}
}
测试代码
public class FactoryMethodDemo {
public static void main(String[] args) {
ProgrammaFactory factory = new JavaProgrammaFactory();
factory.getVideo();
factory.getArticle();
factory = new PythonProgrammaFactory();
factory.getVideo();
factory.getArticle();
}
}
抽象工厂模式适用场景:
- 客户端(应用层)不依赖产品类实例如何被创建、实现等细节
- 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
- 提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖与具体实现
抽象工厂模式优点:
- 具体产品在应用层代码隔离,无需关心创建细节
- 将一个系列的产品族统一到一起创建
抽象工厂模式缺点:
- 规定了所有可能被创建的产品集合,产品族中扩展新的产品等级困难,需要修改抽象工厂的接口
- 增加了系统的抽象性和理解难度
完整代码:抽象工厂模式
总结
工厂方法模式和抽象工厂模式都是用来创建对象的设计模式。调用者无需知道对象被创建的具体过程,对调用者来说工厂类就是一个黑盒。
工厂方法模式中,每个工厂只能生产一类产品,而抽象工厂模式中,每个工厂可以生产一系列产品。