设计模式之抽象工厂模式

abstract-factory-design-pattern

抽象工厂模式的概念、抽象工厂的结构、抽象工厂的优缺点、抽象工厂的使用场景、抽象工厂的实现示例、抽象工厂的源码分析


1、抽象工厂的概念

  抽象工厂模式,即工厂方法模式的升级版,其可以生产一个产品族的产品。

  工厂方法模式的局限性是只能生产一类产品,这里我们把同类产品呢叫做同等级产品,如手机是一个等级,电脑是一个等级。一个新的定义,就是同族产品,如华为手机、华为电脑是同一族,同属华为族;苹果手机、苹果电脑是同一族,同属苹果族。于是,产品工厂的定义也由同等级工厂升级为同族产品工厂,如华为工厂、苹果工厂。不言而喻,不管是华为工厂还是苹果工厂,都具有生产手机和电脑的功能,故,抽象工厂的的作用就被定义了,那就是定义生产手机和电脑。

2、抽象工厂的结构

  • 抽象产品:定义同等级产品的行为,即抽象工厂模式中有多个抽象产品类。
  • 具体产品:实现抽象产品,使产品具像化。
  • 抽象工厂:定义多个同等级产品的生产行为,即每次可生产出同族的不同等级的产品。
  • 具体工厂:实现抽象工厂,来创建一个具体产品的对象实例。

abstract-factory-class

3、抽象工厂的优缺点

  • 优点:
    • 可在类内部对产品族中相关联的多等级产品共同管理,而不必增加新的类管理。
    • 增加一个新产品族时,无需修改原有代码,只需增加该产品族的具体产品及其对应的产品工厂即可。满足开闭原则。
  • 缺点:
    • 当增加一个新等级的产品时,几乎所有的工厂类都需要改动,所以产品等级的划分非常重要。

4、抽象工厂的使用场景

  • 系统中有多个产品族,每个具体工厂创建属于同族单不同等级的产品。
  • 系统每次只能使用同一族产品,即同族不同等级的产品。

5、抽象工厂的实现示例

抽象产品一:

public interface ComputeProduct {

    /**
     * 行为
     */
    void behavior();
}

抽象产品一的具体产品一:

public class HuaComputeProduct implements ComputeProduct {

    @Override
    public void behavior() {
        System.out.println("我是华为电脑");
    }
}

抽象产品一的具体产品二:

public class AppleComputeProduct implements ComputeProduct {

    @Override
    public void behavior() {
        System.out.println("我是苹果电脑");
    }
}

抽象产品二:

public interface PhoneProduct {

    /**
     * 行为
     */
    void behavior();
}

抽象产品二的具体产品一:

public class HuaPhoneProduct implements PhoneProduct {

    @Override
    public void behavior() {
        System.out.println("我是华为手机");
    }
}

抽象产品二的具体产品二:

public class ApplePhoneProduct implements PhoneProduct {

    @Override
    public void behavior() {
        System.out.println("我是苹果手机");
    }
}

抽象工厂:

public interface Factory {

    /**
     * 生产电脑
     * @return
     */
    ComputeProduct productCompute();

    /**
     * 生产手机
     * @return
     */
    PhoneProduct productPhone();
}

具体工厂一:

public class HuaFactory implements Factory {

    @Override
    public ComputeProduct productCompute() {
        return new HuaComputeProduct();
    }

    @Override
    public PhoneProduct productPhone() {
        return new HuaPhoneProduct();
    }
}

具体工厂二:

public class AppleFactory implements Factory {

    @Override
    public ComputeProduct productCompute() {
        return new AppleComputeProduct();
    }

    @Override
    public PhoneProduct productPhone() {
        return new ApplePhoneProduct();
    }
}

测试:

public class AbstractFactoryTest {

    public static void main(String[] args) {
        Factory huaFactory = new HuaFactory();
        Factory appleFactory = new AppleFactory();

        ComputeProduct huaComputeProduct = huaFactory.productCompute();
        PhoneProduct huaPhoneProduct = huaFactory.productPhone();

        ComputeProduct appleComputeProduct = appleFactory.productCompute();
        PhoneProduct applePhoneProduct = appleFactory.productPhone();

        huaComputeProduct.behavior();
        huaPhoneProduct.behavior();

        appleComputeProduct.behavior();
        applePhoneProduct.behavior();
    }
}

测试结果:

我是华为电脑
我是华为手机
我是苹果电脑
我是苹果手机

6、抽象工厂的源码分析

  loading…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值