什么是抽象工厂模式?
抽象工厂模式,可以说是工厂模式的升级版
关于工厂模式:通俗易懂的工厂模式
抽象工厂:围绕着一个超级工厂去创建其他的工厂,这个超级工厂也被称为工厂的工厂,这个设计模式属于创建型模式,提供了一种创建对象的最佳方式
- 相关的概念
产品族:某个品牌下面的所有产品,比如苹果下的手机、平板就是同一产品族
产品等级:不同品牌下面的同种产品,比如苹果的手机和华为的手机就是同一产品等级
简单的代码实现
场景描述:苹果和华为都有手机产品和平板产品,在客户端调用时,我们需要直接用工厂接口创建需要的苹果和华为工厂,从而拿到想要的产品
下面代码的整体架构
- 手机和平板是两个产品,所以我们先创建两个抽象产品接口
/**
* 手机产品
*/
public interface PhoneProduct {
void start();
}
/**
* 平板产品
*/
public interface PadProduct {
void start();
}
- Iphone,Ipad,HuaweiMate,HuaweiPad四个产品的具体产品实现类
public class Iphone implements PhoneProduct {
@Override
public void start() {
System.out.println("您正在使用iphone系列产品");
}
}
public class Ipad implements PadProduct{
@Override
public void start() {
System.out.println("您正在使用ipad系列产品");
}
}
public class HuaweiMate implements PhoneProduct{
@Override
public void start() {
System.out.println("您正在使用HuaweiMate系列产品");
}
}
public class HuaweiPad implements PadProduct{
@Override
public void start() {
System.out.println("您正在使用HuaweiPad系列产品");
}
}
- 接下来就是超级工厂的抽象实现
public interface SuperProductFactory {
//获取手机产品
PhoneProduct getphoneProduct();
//获取平板产品
PadProduct getpadProduct();
}
- 苹果和华为是两个不同的品牌,所以他们两个各自都有一个各自的工厂类
public class AppleFactory implements SuperProductFactory{
@Override
public PhoneProduct getphoneProduct() {
return new Iphone();
}
@Override
public PadProduct getpadProduct() {
return new Ipad();
}
}
public class HuaweiFactory implements SuperProductFactory{
@Override
public PhoneProduct getphoneProduct() {
return new HuaweiMate();
}
@Override
public PadProduct getpadProduct() {
return new HuaweiPad();
}
}
- 最后就是客户端了,可以直接用超级工厂来创建品牌工厂,从而得到需要的产品
public class Client {
public static void main(String[] args) {
/**
* 利用苹果工厂,得到苹果产品
*/
SuperProductFactory apple = new AppleFactory();
PhoneProduct iphone = apple.getphoneProduct();
PadProduct ipad = apple.getpadProduct();
iphone.start();
ipad.start();
/**
* 利用华为工厂,得到华为产品
*/
SuperProductFactory huawei = new HuaweiFactory();
PhoneProduct huaweiMate = huawei.getphoneProduct();
PadProduct huaweiPad = huawei.getpadProduct();
huaweiMate.start();
huaweiPad.start();
}
}
抽象工厂模式的优缺点
- 优点:产品等级容易扩展
假设我们现在有一个新的品牌三星,也可以生产手机和平板,我们扩展的时候是不用修改原来的代码的,只需要新增工厂实现类和产品实现类即可。
- 缺点:产品族难扩展
假如说苹果和华为除了手机和平板之外扩充了新的业务,又开始造耳机了,那么我们不仅要增加产品接口,还需要修改顶层的工厂类
抽象工厂模式在java中的应用
- 在spring中,BeanFactory是所有工厂的父类,这样就可以根据不同的策略调用getBean方法,从而获取具体的对象