抽象工厂模式(别名:配套)
提供一个创建一系列或相互依赖对象的接口,而无需指定它们具体的类。
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
package Kit;
public interface Firearms {
public abstract void fire();
}
ConcreteProduct的实现类Pistol.java
package Kit;
public class Pistol implements Firearms{
@Override
public void fire() {
System.out.println("手枪开火 ");
}
}
ConcreteProduct的实现类MachineGun.java
package Kit;
public class MachineGun implements Firearms {
@Override
public void fire() {
System.out.println("机关枪开火");
}
}
Product的接口类Bullet.java
package Kit;
public interface Bullet {
public abstract String getName();
}
ConcreteProduct的实现类PistolBullet.java
package Kit;
public class PistolBullet implements Bullet {
private String name = "手枪子弹";
@Override
public String getName() {
return name;
}
}
ConcreteProduct的实现类MachineGunBullet.java
package Kit;
public class MachineGunBullet implements Bullet {
private String name = "机关枪子弹";
@Override
public String getName() {
return name;
}
}
Creator的接口类Armory.java
package Kit;
public interface Armory {
public abstract Firearms getFirearms();
public abstract Bullet getBullet();
}
ConcreteCreator的实现类PistolFactory.java
package Kit;
public class PistolFactory implements Armory{
@Override
public Firearms getFirearms() {
return new Pistol();
}
@Override
public Bullet getBullet() {
return new PistolBullet();
}
}
ConcreteCreator的实现类MachineGunFactory.java
package Kit;
public class MachineGunFactory implements Armory {
@Override
public Firearms getFirearms() {
return new MachineGun();
}
@Override
public Bullet getBullet() {
return new MachineGunBullet();
}
}
测试类Kit.java
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运算符实例化这些对象,即希望用户和创建对象的类脱耦。
- 系统需要为用户提供多个相关的对象,以便用户联合使用它们,但又不希望用户来决定这些对象是如何关联的。
- 系统需要为用户提供一系列对象,但只需要用户知道这些对象有哪些方法可用,不需要用户知道这些对象的创建过程。