什么是抽象工厂模式?
抽象工厂模式,可以说是工厂模式的升级版
关于工厂模式:通俗易懂的工厂模式
抽象工厂:围绕着一个超级工厂去创建其他的工厂,这个超级工厂也被称为工厂的工厂,这个设计模式属于创建型模式,提供了一种创建对象的最佳方式
- 相关的概念
 
产品族:某个品牌下面的所有产品,比如苹果下的手机、平板就是同一产品族
产品等级:不同品牌下面的同种产品,比如苹果的手机和华为的手机就是同一产品等级
简单的代码实现
场景描述:苹果和华为都有手机产品和平板产品,在客户端调用时,我们需要直接用工厂接口创建需要的苹果和华为工厂,从而拿到想要的产品
下面代码的整体架构
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6EsIHoBk-1672990742561)(documents/笔记/images/image-20230106152453596.png)]](https://img-blog.csdnimg.cn/6b8a742fa5c04b79830aeb3cfbb4c5a7.png)
- 手机和平板是两个产品,所以我们先创建两个抽象产品接口
 
/**
 * 手机产品
 */
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();
    }
}
 
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-12QQ92xV-1672990742562)(documents/笔记/images/image-20230106144838502.png)]](https://img-blog.csdnimg.cn/8ff97a64ca0846ccaa690d9e5af82a9b.png)
抽象工厂模式的优缺点
- 优点:产品等级容易扩展
 
假设我们现在有一个新的品牌三星,也可以生产手机和平板,我们扩展的时候是不用修改原来的代码的,只需要新增工厂实现类和产品实现类即可。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2dETkXX-1672990742563)(documents/笔记/images/image-20230106153015114.png)]](https://img-blog.csdnimg.cn/d4555fe9a898474586c3ba972d13ee45.png)
- 缺点:产品族难扩展
 
假如说苹果和华为除了手机和平板之外扩充了新的业务,又开始造耳机了,那么我们不仅要增加产品接口,还需要修改顶层的工厂类
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t6r1WkUy-1672990742563)(documents/笔记/images/image-20230106153300721.png)]](https://img-blog.csdnimg.cn/e0eb0a5fe889499aa10a07cff8e38666.png)
抽象工厂模式在java中的应用
- 在spring中,BeanFactory是所有工厂的父类,这样就可以根据不同的策略调用getBean方法,从而获取具体的对象
 
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kyWhbnPN-1672990742563)(documents/笔记/images/image-20230106153822258.png)]
外链图片转存中...(img-t6r1WkUy-1672990742563)]](https://img-blog.csdnimg.cn/f40d01a2c99a4626ba62b9742575bbc8.png)


















