之前学习了简单工厂模式和工厂方法模式,这次继续深入,记录下抽象工厂模式
一、什么是抽象工厂模式
- 抽象工厂模式 (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();
}
}
输出结果
以上就是抽象工厂模式的一个小例子