博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创建型模式——抽象工厂(二)
阅读量:6311 次
发布时间:2019-06-22

本文共 2737 字,大约阅读时间需要 9 分钟。

该项目源码地址:(设计模式相关代码与笔记)

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.cnblogs.com/gj-blog/p/10929466.html

你可能感兴趣的文章
JavaWeb笔记——JSTL标签
查看>>
Eclipse插件大全 挑选最牛的TOP30
查看>>
一些实用性的总结与纠正
查看>>
Kubernetes概念
查看>>
逻辑卷管理器(LVM)
查看>>
一个小代码,欢迎大佬的意见,求指正
查看>>
搭建LAMP架构
查看>>
神经网络注意力机制--Attention in Neural Networks
查看>>
Spring.Net+WCF实现分布式事务
查看>>
在Linux上高效开发的7个建议
查看>>
java数据结构 - 数组使用的代码
查看>>
个人简历-项目经验
查看>>
swoole异步任务task处理慢请求简单实例
查看>>
oracle数据泵导入分区表统计信息报错(四)
查看>>
spring技术内幕读书笔记之IoC容器的学习
查看>>
细说多线程(五) —— CLR线程池的I/O线程
查看>>
JavaScript instanceof和typeof的区别
查看>>
Hadoop文件系统详解-----(一)
查看>>
《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(8)--- 主动器...
查看>>
状态码
查看>>