Java常用设计模式--三种工厂模式之抽象工厂模式(Abstract Factory Pattern)

2020-08-13 11:37:34 浏览数 (2)

抽象工厂方法模式角色:

  1. 抽象工厂(AbstractFactory)角色 :是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
  2. 具体工厂类(ConreteFactory)角色 :这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建某一种产品对象。
  3. 抽象产品(Abstract Product)角色 :工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
  4. 具体产品(Concrete Product)角色 :抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。在抽象工厂中创建的产品属于同一产品族,这不同于工厂模式中的工厂只创建单一产品,。

抽象工厂模式与工厂方法模式的区别?

抽象工厂是生产创建一组相关或者相互依赖的产品对象,这些产品对象必须相互是有关系或有依赖的,而工厂方法中的工厂是生产单一产品对象的工厂。

学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族产品等级

所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族

抽象工厂模式所提供的一系列产品就组成一个产品族;

而工厂方法提供的一系列产品称为一个等级结构。

拿手机的例子来说明他们之间的区别:比如华为P30的运行内存、机身内存、电池容量组成一个产品族和小米10的运行内存、机身内存、电池容量产品族,而这两个产品族都来自三个产品等级:运行内存、机身内存、电池容量

代码语言:javascript复制
package com.example.abstractfactory;

public interface IHuawei {

    void show();

}
代码语言:javascript复制
package com.example.abstractfactory;

public interface IXiaomi {

    void show();

}
代码语言:javascript复制
package com.example.abstractfactory;

public class HuaWeiP30 implements IHuawei {
    @Override
    public void show() {
        System.out.println("我是华为p30");
    }
}
代码语言:javascript复制
package com.example.abstractfactory;

public class XiaoMi10 implements IXiaomi {
    @Override
    public void show() {
        System.out.println("我是小米10");
    }
}
代码语言:javascript复制
package com.example.abstractfactory;

public interface IFactory {

    IHuawei createHuaWei();

    IXiaomi createXiaoMi();

}
代码语言:javascript复制
package com.example.abstractfactory;

public class Factory implements  IFactory{
    @Override
    public IHuawei createHuaWei() {
        return new HuaWeiP30();
    }

    @Override
    public IXiaomi createXiaoMi() {
        return new XiaoMi10();
    }
}
代码语言:javascript复制
package com.example.abstractfactory;

public class Test {

    public static void main(String[] args) {
        IFactory factory = new Factory();
        factory.createHuaWei().show();
        factory.createXiaoMi().show();
    }

}

抽象工厂模式的优点

  • 分离接口和实现

  客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。

  • 使切换产品族变得容易

  因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从huawei系列到xiaomi系列只需要切换一下具体工厂。

抽象工厂模式的缺点

  • 不太容易扩展新的产品

  如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。

0 人点赞