前言:工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是抽象工厂模式的基本思想。
定义
抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
抽象工厂模式和工厂方法模式的区别
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。
简单来说它们的区别:
实例 -> 类 -> 类工厂
实例 -> 类 -> 类工厂 -> 抽象工厂
抽象工厂模式实现方式
抽象工厂模式包含的角色(要素)
角色 | 描述 | 作用 |
---|---|---|
AbstractFactory | 抽象工厂 | 用于声明生成抽象产品的方法 |
ConcreteFactory | 具体工厂 | ,实现抽象工厂定义的方法,具体实现一系列产品对象的创建 |
AbstractProduct | 抽象产品 | 定义一类产品对象的接口 |
ConcreteProduct | 具体产品 | 通常在具体工厂里,会选择具体的产品实现,来创建符合抽象工厂定义的方法返回的产品类型的对象 |
Client | 客户端 | 使用抽象工厂来获取一系列所需要的产品对象 |
UML类图
实例
抽象产品
interface Keyboard{
void input();
}
interface Mouse{
void click();
}
具体产品
class MacKeyboard implements Keyboard{
@Override
public void input() {
System.out.println("Mac 键盘");
}
}
class MacMouse implements Mouse{
@Override
public void click() {
System.out.println("Mac 鼠标");
}
}
class WinKeyboard implements Keyboard{
@Override
public void input() {
System.out.println("Win 键盘");
}
}
class WinMouse implements Mouse{
@Override
public void click() {
System.out.println("Win 鼠标");
}
}
抽象工厂
interface Hardware{
public Keyboard manufactureKeyboard();
public Mouse manufactureMouse();
}
具体工厂类
class MacFactory implements Hardware{
@Override
public Keyboard manufactureKeyboard() {
return new MacKeyboard();
}
@Override
public Mouse manufactureMouse() {
return new MacMouse();
}
}
class WinFactory implements Hardware{
@Override
public Keyboard manufactureKeyboard() {
return new WinKeyboard();
}
@Override
public Mouse manufactureMouse() {
return new WinMouse();
}
}
客户端
/**
* 抽象工厂模式
*/
public class AbstractFactoryPattern {
public static void main(String[] args) {
Hardware mac = new MacFactory();
mac.manufactureKeyboard().input();
mac.manufactureMouse().click();
Hardware win = new WinFactory();
win.manufactureKeyboard().input();
win.manufactureMouse().click();
}
}
本文参考于:抽象工厂模式和工厂模式的区别?