java设计模式精讲 Debug 方式+内存分析 第6章 抽象工厂模式

6-1 抽象工厂讲解

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


工厂方法模式针对的就是产品等级结构
而抽象方法模式针对的就是产品族
我们只要在美的产品族里面取空调,取出来的肯定是美的的空调,我们在美的的产品族里面取冰箱,取出来的肯定也是美的的电冰箱,只要我们确定这个产品的产品族和产品等级结构,我们就可以唯一的确定这个产品:
在这里插入图片描述


在这里插入图片描述


从理论上来说:当一个工厂可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,那这个时候,抽象工厂模式要比工厂方法模式要更为简单,更有效率;
在这里插入图片描述

6-2 抽象工厂coding

现在,我们提一个业务场景,现在提出了新的要求:每一个课程不仅仅要有视频,还要有对应的手记,如果用工厂方法的方式来进行扩展的话 ,这个时候,既要有java的手记类,python的手记类,FE的手记类,还有手记的抽象类,手记的工厂,java的手记的工厂,python的手记的工厂,FE的手记的工厂,这个时候,就很容易出现类爆炸的现象;

原来是一个视频是一个课程,现在一个视频加上一个手记是一个课程;


java视频,python视频,fe视频他们属于同一产品等级,都是视频
java手记,python手记,fe手记他们也属于同一产品等级,都是手记

而java手记,java视频他们处于同一产品族,都是java相关的;
同一产品族,我们就看java,还是python还是fe;
同一产品等级,我们就看它是视频还是手记即可;


我们先来创建一个课程工厂:
课程类:

public abstract class Video {
    public abstract void produce();
}

手记类:

public abstract class Article {
    public abstract void produce();
}

课程工厂类:

public interface CourseFactory {
    /** 获取视频 */
    Video getVideo();

    /** 获取手记 */
    Article getArticle();
}

现在来创建java产品族的课程工厂:

public class JavaCourseFactory implements CourseFactory {
    @Override
    public Video getVideo() {
        return null;
    }

    @Override
    public Article getArticle() {
        return null;
    }
}

Java视频类:

public class JavaVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Java视频");
    }
}

Java手记类:

public class JavaArticle extends Article {
    @Override
    public void produce() {
        System.out.println("编写Java课程手记");
    }
}

现在,产品族里面的工厂类就可以这样来写了:

public class JavaCourseFactory implements CourseFactory {
    @Override
    public Video getVideo() {
        return new JavaVideo();
    }

    @Override
    public Article getArticle() {
        return new JavaArticle();
    }
}

这里就是把视频工厂和手记工厂合在了一起;作为一个产品族;


我们再来写一个python的产品族的:
PythonArticle类:

public class PythonArticle extends Article {
    @Override
    public void produce() {
        System.out.println("编写Python课程手记");
    }
}

PythonVideo 类

public class PythonVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Python的视频");
    }
}

现在,我们再来创建Python产品族的课程工厂(视频和手记合在了一起):

public class PythonCourseFactory implements CourseFactory{

    @Override
    public Video getVideo() {
        return new PythonVideo();
    }

    @Override
    public Article getArticle() {
        return new PythonArticle();
    }
}

这个就是现在的类图:
在这里插入图片描述
测试:
只要是从Java产品族里面拿的肯定是Java的视频和Java的手记

public class Test {
    public static void main(String[]args){
        CourseFactory courseFactory = new JavaCourseFactory();
        Article article = courseFactory.getArticle();
        Video video = courseFactory.getVideo();
        /** 只要是从Java产品族里面拿的肯定是Java的视频和Java的手记 */
        article.produce();
        video.produce();
    }
}

运行结果:

编写Java课程手记
录制Java视频


在这里插入图片描述

这样的话,就可以进行解藕;

在使用抽象工厂的时候,尽量找那种固定程度比较高的,像课程里面的视频和手记,视频和手记都是必须要有的,就可以用抽象工厂模式来解决;

缺点:在新增产品等级的时候,会比较的麻烦;

如果在现有的产品族里面添加新的产品等级,就违背了开闭原则了;

如果我们还要把源码放到课程的这个产品族里面,那么对原来的修改就比较大了;


6-3 抽象工厂源码解析

在这里插入图片描述
在这里插入图片描述

他们都是在同一个产品族里面;


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_37778801/article/details/84310346
今日推荐