Java设计模式--抽象工厂模式

抽象工厂模式(别名:配套)

提供一个创建一系列或相互依赖对象的接口,而无需指定它们具体的类。

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

文章目录
  1. 1. 抽象工厂模式(别名:配套)
  2. 2. Abstract Factory Pattern(Another Name: Kit)
  3. 3. 类图
  4. 4. 模式的结构与使用
  5. 5. 简单的例子
    1. 5.1. Product的接口类Firearms.java
    2. 5.2. ConcreteProduct的实现类Pistol.java
    3. 5.3. ConcreteProduct的实现类MachineGun.java
    4. 5.4. Product的接口类Bullet.java
    5. 5.5. ConcreteProduct的实现类PistolBullet.java
    6. 5.6. ConcreteProduct的实现类MachineGunBullet.java
    7. 5.7. Creator的接口类Armory.java
    8. 5.8. ConcreteCreator的实现类PistolFactory.java
    9. 5.9. ConcreteCreator的实现类MachineGunFactory.java
    10. 5.10. 测试类Kit.java
  6. 6. 抽象工厂模式的优点
  7. 7. 适用抽象工厂模式的情景
  8. 8. 下载源码请到