抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory Pattern)

是一种创建型设计模式,它提供了一种方式,将一组具有共同主题的单独的工厂封装起来,而不需要指定它们的具体类。抽象工厂模式允许客户端在不指定具体类的情况下创建一系列相互关联或相互依赖的产品族。

模式结构

抽象工厂模式包含以下角色:

  1. 抽象工厂(Abstract Factory):声明了一组用于创建一系列相关或相互依赖对象的操作接口。
  2. 具体工厂(Concrete Factory):实现了抽象工厂中定义的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品族都是由一组具有相同使用接口,但是由不同工厂实现的类所组成的。
  3. 抽象产品(Abstract Product):为每种产品声明接口,在抽象工厂中声明创建产品的接口。
  4. 具体产品(Concrete Product):实现抽象产品接口的具体类。
  5. 工作原理
  6. 抽象工厂模式主要是用于创建一组相关或相互依赖的对象,而无需指定它们的具体类。在抽象工厂模式中,客户端不直接与具体产品打交道,而是与抽象工厂和抽象产品打交道。客户端只需要知道所需产品的抽象类型,就可以通过抽象工厂创建具体的产品对象。

优点

  1. 封装性:客户端只需要知道所需产品的抽象类型,就能得到具体的产品对象,而无需知道具体产品的类名。
  2. 产品族内的约束:抽象工厂模式能够确保客户端始终只使用同一系列的产品。
  3. 易于交换产品系列:一个具体的工厂类能够在不修改任何客户端代码的情况下,返回与原产品系列功能相同但属于另一个不同产品系列的实例。

缺点

  1. 难以支持新种类的产品:每增加一个新的产品族,就需要增加一个具体工厂类,这可能会导致系统类的个数大量增加,从而增加系统的复杂性。
  2. 难以扩展增加新的产品:对于每一个产品族,都需要增加相应的具体产品类和抽象产品接口,这同样会增加系统的复杂性。
  3. 应用场景
  4. 当需要创建的对象是一系列相互关联或相互依赖的产品族时。
  5. 当系统中有多于一个的产品族,而每次只使用其中某一产品族时。
  6. 当系统提供一个产品类的库,并且只想显示它们的接口而不是实现时。
  7. 当系统的产品有多于一个的变种,而系统的配置需要由消费这些产品的外部决定时。

示例代码(Java)

// 抽象产品A  
public interface ProductA {  
    void use();  
}  
  
// 抽象产品B  
public interface ProductB {  
    void use();  
}  
  
// 具体产品A1  
public class ConcreteProductA1 implements ProductA {  
    @Override  
    public void use() {  
        System.out.println("使用产品A1");  
    }  
}  
  
// 具体产品B1  
public class ConcreteProductB1 implements ProductB {  
    @Override  
    public void use() {  
        System.out.println("使用产品B1");  
    }  
}  
  
// 具体产品A2  
public class ConcreteProductA2 implements ProductA {  
    @Override  
    public void use() {  
        System.out.println("使用产品A2");  
    }  
}  
  
// 具体产品B2  
public class ConcreteProductB2 implements ProductB {  
    @Override  
    public void use() {  
        System.out.println("使用产品B2");  
    }  
}  
  
// 抽象工厂  
public interface AbstractFactory {  
    ProductA createProductA();  
    ProductB createProductB();  
}  
  
// 具体工厂1  
public class ConcreteFactory1 implements AbstractFactory {  
    @Override  
    public ProductA createProductA() {  
        return new ConcreteProductA1();  
    }  
  
    @Override  
    public ProductB createProductB() {  
        return new ConcreteProductB1();  
    }  
}  
  
// 具体工厂2  
public class ConcreteFactory2 implements AbstractFactory {  
    @Override  
    public ProductA createProductA() {  
        return new ConcreteProductA2();  
    }  
  
    @Override  
    public ProductB createProductB() {  
        return new ConcreteProductB2();  
    }  
}  
  
// 客户端代码  
public class Client {  
    public static void main(String[] args) {  
        AbstractFactory factory1 = new ConcreteFactory1();  
        ProductA productA1 = factory1.createProductA();  
        ProductB productB1 = factory1.createProductB();  
        productA1.use(); // 输出:使用产品A1  
        productB1.use(); // 输出:使用产品
posted @   z_coding  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示