23种设计模式之抽象工厂模式

抽象工厂模式

工厂方法模式存在一个工厂只能创建一个具体产品类的问题,所以需要一种工厂可以提供多种产品对象,这就是抽象工厂模式。

1、定义

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类

产品等级结构和产品族

首先要引入两个概念

  • 产品等级结构:即产品的继承结构
  • 产品族:在抽象工厂模式中,产品族是指由同一个工厂生成的位于不同产品等级结构中的一组产品
    产品族与产品等级结构示意图

2、抽象工厂模式结构

  • AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,一个方法对应一种产品
  • ConcreteFactory(具体工厂):实现抽象工厂方法,生成一组具体产品,这些产品构成一个产品族
  • AbstractProduct(抽象产品):产品声明接口,声明了产品所有具体的业务方法
  • ConcreteProduct(具体产品):实现抽象产品方法,定义具体工程生产的具体产品对象
    抽象工厂模式结构图

3、实例代码

AbstractFactory

定义抽象工厂类IAnimalFactory

public interface IAnimalFactory {

    ICat createCat();

    IDog createDog();
}

ConcreteFactory

创建抽象工厂类的两个实现类,WhiteAnimalFactory和BlackAnimalFactory

public class BlackAnimalFactory implements IAnimalFactory{
    @Override
    public ICat createCat() {
        return new BlackCat();
    }

    @Override
    public IDog createDog() {
        return new BlackDog();
    }
}
public class WhiteAnimalFactory implements IAnimalFactory{
    @Override
    public ICat createCat() {
        return new WhiteCat();
    }

    @Override
    public IDog createDog() {
        return new WhiteDog();
    }
}

AbstractProduct

定义抽象工厂中要生产的抽象产品接口ICat和IDog

public interface ICat {

    void run();
}
public interface IDog {

    void run();
}

ConcreteProduct

创建产品的实现类BlackCat、BlackDog、WhiteCat、WhiteDog

public class BlackCat implements ICat{
    @Override
    public void run() {
        System.out.println("一只黑猫嗖嗖嗖嗖");
    }
}
public class WhiteCat implements ICat {

    @Override
    public void run() {
        System.out.println("一只白猫嗖嗖嗖嗖");
    }
}
public class BlackDog implements IDog{
    @Override
    public void run() {
        System.out.println("一只黑狗嗖嗖嗖嗖");
    }
}
public class WhiteDog implements IDog{
    @Override
    public void run() {
        System.out.println("一只白狗嗖嗖嗖嗖");
    }
}

编写一个测试类Client

public class Client {

    public static void main(String[] args) {
        IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
        ICat blackCat = blackAnimalFactory.createCat();
        IDog blackDog = blackAnimalFactory.createDog();
        blackDog.run();
        blackCat.run();

        IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
        ICat whiteCat = whiteAnimalFactory.createCat();
        IDog whiteDog = whiteAnimalFactory.createDog();
        whiteCat.run();
        whiteDog.run();
    }
}
一只黑狗嗖嗖嗖嗖
一只黑猫嗖嗖嗖嗖
一只白猫嗖嗖嗖嗖
一只白狗嗖嗖嗖嗖

4、抽象工厂模式优缺点

4.1优点
  • 抽象工厂模式隔离了具体类的生成。所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例就可以在某种程度上改变整个系统的行为
  • 一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象(将一个系列的产品统一一起创建)
  • 增加新的产品族,无需改变已有系统,符合开闭原则
4.2缺点
  • 增加新的产品等级结构会很麻烦,需对原有系统做较大的修改,甚至需要修改抽象层代码,违背开闭原则

5、抽象工厂模式适用环境

  • 一系列相关产品对象(属于同一产品族)一起创建时需要大量的重复代码
  • 产品等级结构稳定,设计完成后尽可能的不会向系统中增加或删除等级结构
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时
  • 一个系统要独立于它的产品的创建、组合和表示时。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值