1. 模式简介
提供一个创建一系列相关或者相互依赖对象的接口,无须指定具体的类,属于创建型设计模式。
2. 示例代码
- 产品抽象
// 手机产品抽象类
public abstract class Phone {
/**
* 描述
*/
public abstract void describe();
}
// 笔记本产品抽象类
public abstract class Laptop {
/**
* 描述
*/
public abstract void describe();
}
// 耳机产品抽象类
public abstract class EarPhone {
/**
* 描述
*/
public abstract void describe();
}
- 科技公司工厂抽象
// 科技公司抽象工厂类
public abstract class TechFactory {
/**
* 卖手机
*
* @return 手机
*/
public abstract Phone sellPhone();
/**
* 卖笔记本
*
* @return 笔记本
*/
public abstract Laptop sellLaptop();
/**
* 卖耳机
*
* @return 耳机
*/
public abstract EarPhone sellEarPhone();
}
- 统一品牌产品的具体实现 / 科技公司的具体实现
// 小米品牌小米手机具体实现
public class MiPhone extends Phone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("小米手机");
}
}
// 小米品牌小米笔记本具体实现
public class MiLaptop extends Laptop{
/**
* 描述
*/
@Override
public void describe() {
System.out.println("小米笔记本");
}
}
// 小米品牌小米耳机具体实现
public class MiEarPhone extends EarPhone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("小米耳机");
}
}
// 小米公司工厂具体实现
public class MiTechCompany extends TechFactory {
/**
* 卖手机
*
* @return 手机
*/
@Override
public Phone sellPhone() {
return new MiPhone();
}
/**
* 卖笔记本
*
* @return 笔记本
*/
@Override
public Laptop sellLaptop() {
return new MiLaptop();
}
/**
* 卖耳机
*
* @return 耳机
*/
@Override
public EarPhone sellEarPhone() {
return new MiEarPhone();
}
}
// 华为品牌华为手机具体实现
public class HuaweiPhone extends Phone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("华为手机");
}
}
// 华为品牌华为笔记本具体实现
public class HuaweiLaptop extends Laptop{
/**
* 描述
*/
@Override
public void describe() {
System.out.println("华为笔记本");
}
}
// 华为品牌华为耳机具体实现
public class HuaweiEarPhone extends EarPhone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("华为耳机");
}
}
// 华为公司工厂具体实现
public class HuaweiTechCompany extends TechFactory {
/**
* 卖手机
*
* @return 手机
*/
@Override
public Phone sellPhone() {
return new HuaweiPhone();
}
/**
* 卖笔记本
*
* @return 笔记本
*/
@Override
public Laptop sellLaptop() {
return new HuaweiLaptop();
}
/**
* 卖耳机
*
* @return 耳机
*/
@Override
public EarPhone sellEarPhone() {
return new HuaweiEarPhone();
}
}
// 苹果品牌苹果手机具体实现
public class IPhone extends Phone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("IPhone");
}
}
// 苹果品牌苹果笔记本具体实现
public class MacBookPro extends Laptop{
/**
* 描述
*/
@Override
public void describe() {
System.out.println("MacBookPro");
}
}
// 苹果品牌苹果耳机具体实现
public class AirPod extends EarPhone {
/**
* 描述
*/
@Override
public void describe() {
System.out.println("AirPod");
}
}
// 苹果公司工厂具体实现
public class AppleTechCompany extends TechFactory {
/**
* 卖手机
*
* @return 手机
*/
@Override
public Phone sellPhone() {
return new IPhone();
}
/**
* 卖笔记本
*
* @return 笔记本
*/
@Override
public Laptop sellLaptop() {
return new MacBookPro();
}
/**
* 卖耳机
*
* @return 耳机
*/
@Override
public EarPhone sellEarPhone() {
return new AirPod();
}
}
3. UML图例

4. 应用
// Spring 源码
// AbstractBeanFactory -> AbstractAutowireCapableBeanFactory / DefaultListableBeanFactory / XmlBeanFactory
5. 场景
- 客户端不依赖产品类,不关注创建、实现的细节
- 强调一系列产品对象(产品族),一起创建时需要大量创建代码
- 提供一类产品的库,所有的产品以同样的接口出现,从而使客户端不依赖具体实现
6. 优缺点
优点: 具体产品在应用层代码隔离,不关心创建细节;将一系列的产品族对象统一在一起创建
缺点: 添加一种新的产品的时候,需要在工厂接口及其工厂子类都添加实现,不符合开闭原则;增加了系统的抽象性和理解难度