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

最新文章

  1. spring中的定时调度实现TimerFactoryBean引起的隐患
  2. struts下ajax提交与页面进行提示 返回值为null
  3. spinner下拉列表
  4. ssm中使用hibernate-validator验证BO
  5. jQery无缝滚动效果
  6. Node.js Web模块
  7. JAVA面向对象总结
  8. CentOS7下一个mysql安装
  9. rstPixelType Constants
  10. 基于Spring Cloud和Netflix OSS构建微服务,Part 2
  11. 基于jsp+servlet+javabean的MVC模式简单应用
  12. sql里的null和空的区别
  13. CSS Box Model 盒子模型
  14. python中一个py文件如何调用其他py文件中的类和函数
  15. go 0000
  16. mini2440串口使用
  17. 213. House Robber II(动态规划)
  18. WebRTC 零基础开发者教程(中文版)下载
  19. 转载——githup的提交
  20. Web Services 根据wsdl生成代理类

热门文章

  1. C# byte[]转string, string转byte[] 的四种方法
  2. 1.3 eclipse快捷键
  3. 关于反射中如何剔除实体类中serialVersionUID字段
  4. PyCharm 上传项目到码云托管平台
  5. MySQL中 IS NULL、IS NOT NULL、!= 能用上索引吗?
  6. DFS(深度优先搜索)
  7. libcurl库的简介(一)
  8. MyBatis-Spring整合之方式4
  9. Spring Boot 编辑器 IDEA 免费许可申请
  10. Spring Boot Json 之 Jackjson Fastjson