1    代码讲解

1.1  抽象工厂优点

1.2  抽象工厂缺点

1.3  为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式?

2    代码演练

2.1  抽象工厂代码演练

1    代码讲解
1.1  抽象工厂优点

a  应用层代码不和具体的产品发生依赖,只和具体的产品族工厂发生依赖关系,低耦合,高内聚。

b  从具体的产品工厂取出来的肯定是同一产品族,开发的时候逻辑清晰。(ab其实可以归为1点)

c  对于产品族来说,符合开闭原则,增加新的产品族的时候,对扩展开放

1.2  抽象工厂缺点

a  增加新的产品时候,不符合开闭原则,工作量变大(解决方案:针对产品增加时间跨度比较大的业务场景,使用抽象方法比较好)

1.3  为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式?

如果使用工厂设计模式,可能会因为工行类太多而产生类爆炸的现象。

2    代码演练
2.1  抽象工厂代码演练

业务场景:

现在慕课网需要对不同的课程进行区分(产品族),java课程有java视频和java手记两种产品,net课程有net视频和net手机两种产品。

类图:

测试类:

package com.geely.design.pattern.creational.abstractfactory;

public class TestAbstractFactory {
/**
* 制作java类的产品族,制作net类的产品族
* @param args
*/
public static void main(String [] args){
CourseFactory courseFactory1 = new JavaCourseFactory();
Video video1 = courseFactory1.getVideo();
Article article1 = courseFactory1.getArticle();
video1.produce();
article1.produce(); CourseFactory courseFactory2 = new NetCourseFactory();
Video video2 = courseFactory2.getVideo();
Article article2 = courseFactory2.getArticle();
video2.produce();
article2.produce(); }
}

课程工厂(产品族工厂):

package com.geely.design.pattern.creational.abstractfactory;

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

java课程工厂:

package com.geely.design.pattern.creational.abstractfactory;

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

net课程工厂:

package com.geely.design.pattern.creational.abstractfactory;

public class NetVideo implements Video{
@Override
public void produce() {
System.out.println("开始只做点net视频!");
}
}

video类:

package com.geely.design.pattern.creational.abstractfactory;

public interface Video {
void produce();
}

article类:

package com.geely.design.pattern.creational.abstractfactory;

public interface Article {
void produce();
}

javavideo类:

package com.geely.design.pattern.creational.abstractfactory;

public class JavaVideo implements Video{
@Override
public void produce() {
System.out.println("开始制作java视频");
}
}

javaarticle类:

package com.geely.design.pattern.creational.abstractfactory;

public class JavaArticle implements Article{
@Override
public void produce() {
System.out.println("开始录入java笔记!");
}
}

netvideo类:

package com.geely.design.pattern.creational.abstractfactory;

public class NetCourseFactory implements CourseFactory{
@Override
public Video getVideo() {
return new NetVideo();
} @Override
public Article getArticle() {
return new NetArticle();
}
}

netarticle类:

package com.geely.design.pattern.creational.abstractfactory;

public class NetArticle implements Article{
@Override
public void produce() {
System.out.println("开始制做点net笔记!");
}
}

打印日志:

"C:\Program Files\Java\jdk1.6.0_43\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=37199:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.6.0_43\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jce.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\resources.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\out\production\design_pattern" com.geely.design.pattern.creational.abstractfactory.TestAbstractFactory
开始制作java视频
开始录入java笔记!
开始只做点net视频!
开始制做点net笔记! Process finished with exit code 0

设计模式课程 设计模式精讲 6-2 抽象工厂coding的更多相关文章

  1. php设计模式课程---3、为什么会有抽象工厂方法

    php设计模式课程---3.为什么会有抽象工厂方法 一.总结 一句话总结: 解决简单工厂方法增加新选择时无法满足面向对象编程中的开闭原则问题 1.什么是面向对象编程中的开闭原则? 应该对类的增加开放, ...

  2. 设计模式课程 设计模式精讲 17-2 模板方法模式coding

    1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...

  3. 设计模式课程 设计模式精讲 5-2 工厂方法coding

    1 课堂讲义 1.1 产品等级和产品簇 2 代码演练 2.1 工厂方法代码演练 1 课堂讲义 1.1 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的 ...

  4. 设计模式课程 设计模式精讲 7-2 建造者模式Coding

    1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...

  5. 系统架构-设计模式(适配器、观察者、代理、抽象工厂等)及架构模式(C/S、B/S、分布式、SOA、SaaS)(干货)

    博客园首页是需要分享干货的地方,今天早上写的<HRMS(人力资源管理系统)-从单机应用到SaaS应用-系统介绍>内容下架了,所以我就按照相关规定,只分享干货,我把之前写完的内容整理发布上来 ...

  6. 设计模式之美:Abstract Factory(抽象工厂)

    索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 命名约定 实现 实现方式(一):使用 Factory Method 来实现 Abstract Factory. 实现方式(二):使用 Pr ...

  7. 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

    1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...

  8. .NET设计模式 第二部分 创建型模式(2)—抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory) ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变 ...

  9. Android设计模式(十二)--抽象工厂模式

    问题: 抽象工厂模式,是一个,狠恶心的模式,那么这个模式在Android有没实用到过呢? 1.定义: 抽象工厂模式:为创建一组相关或者是相互依赖的对象提供一个接口,而不须要指定他们的详细类. 2.使用 ...

随机推荐

  1. css全站字体,中文英文不同,粗细统一

    @font-face { font-family: vwfont; src: url(/shop-m/public/fonts/VWText-Regular.otf); } @font-face { ...

  2. 1.什么是Mybatis?

    在学习之前我们要回顾以下知识 JDBC Mysql java基础 Maven Junit 什么是 MyBatis? MyBatis 是一款优秀的持久层框架MyBatis 避免了几乎所有的 JDBC 代 ...

  3. LPR-贷款市场报价利率

    贷款市场报价利率(Loan Prime Rate)介绍: 贷款市场报价利率(Loan Prime Rate,简称LPR)是商业银行对其最优质客户执行的贷款利率,其他贷款利率可在此基础上加减点生成.贷款 ...

  4. electron-vue + element-ui构建桌面应用

    最近需要用Node.js做一个桌面的应用,了解到electron可以用来做跨平台的桌面应用,而vue可以用来作为界面的解决方案,研究了一会儿如何把他们两个整合到一起使用,遇到了各种问题而放弃,毕竟作为 ...

  5. java基础(温故而知新)

    一 数据类型 1.1 8种基本数据类型 1.2 引用数据类型 1.3 java内存机制 1.3.1 寄存器 1.3.2 栈 1.3.3 堆 1.3.4. 静态区/方法区 1.3.5. 运行时常量池(R ...

  6. zabbix-agent不能启动:配置文件出现特殊字符导致

    问题如下: 定位查找问题: 命令:journalctl  -xe [重点] 图中可见错误信息在zabbix_agent配置文件中的“hostname=”中不能出现特殊字符,我出错的原因是写成了:hos ...

  7. CSS学习(9)块盒模型应用

    1.改变宽高范围 默认情况下,width和height设置的是内容盒的宽高 页面重构师:将psd文件(设计稿)制作为静态页面 衡量设计稿尺寸的时候,往往使用的是边框盒 CSS3中 box-sizing ...

  8. 喵星之旅-狂奔的兔子-linux安装

    一.前言 本文演示虚拟机安装,和真机区别可能在网卡驱动上有差异. 真机环境:CentOS Linux release 7.6.1810 (Core) 虚拟机(虽然centos系统自带虚拟机软件,但是习 ...

  9. opencv python:图像金字塔

    图像金字塔原理 expand = 扩大+卷积 拉普拉斯金字塔 PyrDown:降采样 PyrUp:还原 example import cv2 as cv import numpy as np # 图像 ...

  10. eclipse中使用maven update project功能后,默认又回到了jre 1.5的解决方案

    在maven项目中的pom.xml中添加以下节点,进行jre版本的配置,配置完后再进行项目更新后,并不会自动切换到jre1.5 添加在pom的url标签后面 <build>         ...