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

    xiaoxiao2026-01-02  0

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

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

    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运算符实例化这些对象,即希望用户和创建对象的类脱耦。系统需要为用户提供多个相关的对象,以便用户联合使用它们,但又不希望用户来决定这些对象是如何关联的。系统需要为用户提供一系列对象,但只需要用户知道这些对象有哪些方法可用,不需要用户知道这些对象的创建过程。

    下载源码请到

    MyGitHub

    最新回复(0)