美文网首页
创建型模式——抽象工厂(二)

创建型模式——抽象工厂(二)

作者: 最后的轻语_dd43 | 来源:发表于2019-05-22 08:26 被阅读0次

该项目源码地址:https://github.com/ggb2312/Code/tree/master/java-basic/design-pattern
(设计模式相关代码与笔记)

1. 定义

抽象工厂模式提供同一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类

2. 适用场景

  • 客户端(应用层)不依赖于具体产品类实例如何被创建、实现等细节
  • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
  • 提供一个产品类的库,所有的产品以同样的接口出现从而使客户端不依赖于具体实现

3. 类图与角色

抽象工厂类图
  • AbstractFactory:抽象工厂接口,里面包含所有的产品创建的抽象方法
  • ConcreteFactory:具体的工厂,创建具有特定实现的产品对象
  • AbstractProduct:抽象产品,有可能由两种不同的实现
  • ConcreteProduct:对于抽象产品的具体分类的实现

4. 产品等级结构与产品族

产品等级结构与产品族

理解抽象工厂和工厂方法需要理解产品等级结构与产品族的区别和关系。
关于产品等级结构与产品族,可以打一个比方
美的生产空调、洗衣机、冰箱;海尔也生产空调、洗衣机、冰箱。
美的空调、美的洗衣机、美的冰箱就是一个产品族
美的空调、海尔空调就是一个产品等级结构
抽象工厂与工厂方法区别:
工厂方法:针对的是产品等级结构
抽象工厂:针对的是产品族

5. 代码实例

背景:现在慕课网需要制作Java、Python等课程,需要视频+手记组合才算一套课程

(1)创建抽象工厂类,定义具体工厂的公共接口

类图对应的角色 AbstractFactory

public interface CourseFactory {
    Video getVideo();
    Article getArticle();
}

(2)创建抽象产品族类,定义具体产品的公共接口

类图对应的角色 AbstractProduct

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

(3)创建具体产品类(继承抽象产品类), 定义生产的具体产品

类图对应的角色 ConcreteProduct

录制java、python视频

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

编写java、python手记

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

(4)创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法

类图对应的角色 ConcreteFactory

JavaCourseFactory工厂录制java视频、编写java手记

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

PythonCourseFactory工厂录制python视频、编写python手记

public class PythonCourseFactory implements CourseFactory {
    @Override
    public Video getVideo() {
        return new PythonVideo();
    }

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

(5)测试

项目结构

慕课网制作java、python课程

public class Test {
    public static void main(String[] args){
       CourseFactory courseFactory = new JavaCourseFactory();
        Video video = courseFactory.getVideo();
        Article article = courseFactory.getArticle();
        article.produce();
        video.produce();
    }
}
测试结果

(6)类图
查看此时的类图帮助理解。
应用层制作java课程时,根本无需关注java视频与java手记的创建等细节,只需要和JavaCourseFactory工厂类打交道即可。

类图

5. 优点

  • 具体产品在应用层代码隔离,无须关系创建细节
  • 将一个系列的产品族统一到一起创建
  • 新的产品族扩展性好,符合了“开闭原则”

6. 缺点

  • 规定了所有可能被创建的产品等级集合,产品族中扩展新的产品等级困难,需要修改抽象工厂的接口,违背了“开闭原则”。
  • 增加了系统的抽象性和理解难度

7. 扩展-JDK1.7源码中的抽象工厂

java.sql.Connection

java.sql.Statement

sqlsessionfactory

相关文章

网友评论

      本文标题:创建型模式——抽象工厂(二)

      本文链接:https://www.haomeiwen.com/subject/mpqbaqtx.html