设计模式-抽象工厂模式

之前学习了简单工厂模式和工厂方法模式,这次继续深入,记录下抽象工厂模式


一、什么是抽象工厂模式

  • 抽象工厂模式 (Abstract Factory Pattern),是所有工厂模式中最为最为抽象和最具一般性的一种形态
  • 抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
  • 抽象工厂模式中存在一个产品族的概念,所谓产品族,是指位于不同产品等级结构中
    功能相关联的产品所组成的家族,抽象工厂模式所提供的一系列产品就组成了一个产品族
  • 优点:
    • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
  • 缺点:
    • 产品族扩展较为困难,因为如果想要增加一个新产品,则需要改动大量的工厂类

二、抽象工厂模式UML图

这里写图片描述


三、抽象工厂模式示例

空调抽象类

/**
 * @Title: AirConditioner.java
 * @Description: 空调抽象类
 * @Author: xj
 * @Date: 2018/8/19 14:53
 */
public abstract class AirConditioner {

}

空调抽象类具体实现

/**
 * @Title: Gree.java
 * @Description: 格力空调
 * @Author: xj
 * @Date: 2018/8/19 15:03
 */
public class Gree extends AirConditioner {

    public Gree() {
        System.out.println("我是一台格力空调!");
    }
}
/**
 * @Title: Midea.java
 * @Description: 美的空调
 * @Author: xj
 * @Date: 2018/8/19 15:05
 */
public class Midea extends AirConditioner {

    public Midea() {
        System.out.println("我是一台美的空调!");
    }
}

电脑抽象类

/**
 * @Title: Computer.java
 * @Description: 电脑抽象类
 * @Author: xj
 * @Date: 2018/8/19 14:51
 */
public abstract class Computer {

}

电脑抽象类具体实现

/**
 * @Title: Alienware.java
 * @Description: 外星人电脑
 * @Author: xj
 * @Date: 2018/8/19 14:56
 */
public class Alienware extends Computer {

    public Alienware() {
        System.out.println("我是一台外星人电脑!");
    }
}
/**
 * @Title: MacBook.java
 * @Description: 苹果电脑
 * @Author: xj
 * @Date: 2018/8/19 14:54
 */
public class MacBook extends Computer {

    public MacBook() {
        System.out.println("我是一台苹果电脑!");
    }
}

电视抽象类

/**
 * @Title: Television.java
 * @Description: 电视抽象类
 * @Author: xj
 * @Date: 2018/8/19 14:53
 */
public abstract class Television {

}

电视抽象类具体实现

/**
 * @Title: Hisense.java
 * @Description: 海信电视
 * @Author: xj
 * @Date: 2018/8/19 14:57
 */
public class Hisense extends Television {

    public Hisense() {
        System.out.println("我是一台海信电视机!");
    }
}
/**
 * @Title: Xiaomi.java
 * @Description: 小米电视
 * @Author: xj
 * @Date: 2018/8/19 15:01
 */
public class Xiaomi extends Television {

    public Xiaomi() {
        System.out.println("我是一台小米电视机!");
    }
}

抽象工厂类,包含所有产品创建的抽象方法

/**
 * @Title: AbstractFactory.java
 * @Description: 抽象工厂类
 * @Author: xj
 * @Date: 2018/8/19 13:31
 */
public abstract class AbstractFactory {

    public abstract AirConditioner createAirConditioner();

    public abstract Computer createComputer();

    public abstract Television createTelevision();
}

买家电一号方案抽象工厂

/**
 * @Title: HomeAppliancesFirstFactory.java
 * @Description: 买家电一号方案
 * @Author: xj
 * @Date: 2018/8/19 15:08
 */
public class HomeAppliancesFirstFactory extends AbstractFactory {

    @Override
    public MacBook createComputer() {
        return new MacBook();
    }

    @Override
    public Gree createAirConditioner() {
        return new Gree();
    }

    @Override
    public Hisense createTelevision() {
        return new Hisense();
    }
}

买家电二号方案抽象工厂

/**
 * @Title: HomeAppliancesSecondFactory.java
 * @Description: 买家电二号方案
 * @Author: xj
 * @Date: 2018/8/19 15:16
 */
public class HomeAppliancesSecondFactory extends AbstractFactory {

    @Override
    public Alienware createComputer() {
        return new Alienware();
    }

    @Override
    public Midea createAirConditioner() {
        return new Midea();
    }

    @Override
    public Xiaomi createTelevision() {
        return new Xiaomi();
    }
}

测试类

/**
 * @Title: Test.java
 * @Description: 测试类
 * @Author: xj
 * @Date: 2018/8/19 15:19
 */
public class Test {

    public static void main(String[] args) {
        AbstractFactory homeAppliancesFirstFactory = new HomeAppliancesFirstFactory();
        homeAppliancesFirstFactory.createAirConditioner();
        homeAppliancesFirstFactory.createComputer();
        homeAppliancesFirstFactory.createTelevision();

        System.out.println("==================================");

        AbstractFactory homeAppliancesSecondFactory = new HomeAppliancesSecondFactory();
        homeAppliancesSecondFactory.createAirConditioner();
        homeAppliancesFirstFactory.createComputer();
        homeAppliancesFirstFactory.createTelevision();
    }
}

输出结果
这里写图片描述


以上就是抽象工厂模式的一个小例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值