抽象工厂模式(别名:配套)
提供一个创建一系列或相互依赖对象的接口,而无需指定它们具体的类。
Abstract Factory Pattern(Another Name: Kit)
Provide an interface for creating an families of related or dependent objects without specifying their concrete classes。
类图
模式的结构与使用
工厂方法模式的结构中包括四个角色。
- 抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法。
- 具体产品(Concrete Product):具体产品是一个类,如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品去实现接口。
- 构造者(Creator):一个接口或者抽象类。构造者负责定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
- 具体构造者(Concrete Creator):具体构造者重写工厂方法使该方法返回具体产品的实例。
简单的例子
Product的接口类Firearms.java
1 2 3 4 5
| package Kit; public interface Firearms { public abstract void fire(); }
|
ConcreteProduct的实现类Pistol.java
1 2 3 4 5 6 7 8 9 10
| package Kit; public class Pistol implements Firearms{ @Override public void fire() { System.out.println("手枪开火 "); } }
|
ConcreteProduct的实现类MachineGun.java
1 2 3 4 5 6 7 8 9 10
| package Kit; public class MachineGun implements Firearms { @Override public void fire() { System.out.println("机关枪开火"); } }
|
Product的接口类Bullet.java
1 2 3 4 5
| package Kit; public interface Bullet { public abstract String getName(); }
|
ConcreteProduct的实现类PistolBullet.java
1 2 3 4 5 6 7 8 9 10 11
| package Kit; public class PistolBullet implements Bullet { private String name = "手枪子弹"; @Override public String getName() { return name; } }
|
ConcreteProduct的实现类MachineGunBullet.java
1 2 3 4 5 6 7 8 9 10 11
| package Kit; public class MachineGunBullet implements Bullet { private String name = "机关枪子弹"; @Override public String getName() { return name; } }
|
Creator的接口类Armory.java
1 2 3 4 5 6
| package Kit; public interface Armory { public abstract Firearms getFirearms(); public abstract Bullet getBullet(); }
|
ConcreteCreator的实现类PistolFactory.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package Kit; public class PistolFactory implements Armory{ @Override public Firearms getFirearms() { return new Pistol(); } @Override public Bullet getBullet() { return new PistolBullet(); } }
|
ConcreteCreator的实现类MachineGunFactory.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package Kit; public class MachineGunFactory implements Armory { @Override public Firearms getFirearms() { return new MachineGun(); } @Override public Bullet getBullet() { return new MachineGunBullet(); } }
|
测试类Kit.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package Kit; public class Kit { public static void main(String[] args) { PistolFactory pf = new PistolFactory(); System.out.println(pf.getBullet().getName()); pf.getFirearms().fire(); MachineGunFactory mgf = new MachineGunFactory(); System.out.println(mgf.getBullet().getName()); mgf.getFirearms().fire(); } }
|
抽象工厂模式的优点
- 抽象工厂模式可以为用户创建一系列相关的对象,使用户和创建这些对象的类脱耦。
- 使用抽象工厂模式可以方便的为用户配置一系列对象。用户使用不同的具体工厂就能得到一组相关的对象,同时也能避免用户混到不同系列的对象中。
- 在抽象工厂模式中,可以随时增加“具体工厂”为用户提供一组相关的对象。
适用抽象工厂模式的情景
- 系统需要为用户提供多个对象,但不希望用户直接使用new运算符实例化这些对象,即希望用户和创建对象的类脱耦。
- 系统需要为用户提供多个相关的对象,以便用户联合使用它们,但又不希望用户来决定这些对象是如何关联的。
- 系统需要为用户提供一系列对象,但只需要用户知道这些对象有哪些方法可用,不需要用户知道这些对象的创建过程。
下载源码请到
MyGitHub