设计模式课程 设计模式精讲 6-2 抽象工厂coding
2024-09-14 10:29:37
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
最新文章
- spring中的定时调度实现TimerFactoryBean引起的隐患
- struts下ajax提交与页面进行提示 返回值为null
- spinner下拉列表
- ssm中使用hibernate-validator验证BO
- jQery无缝滚动效果
- Node.js Web模块
- JAVA面向对象总结
- CentOS7下一个mysql安装
- rstPixelType Constants
- 基于Spring Cloud和Netflix OSS构建微服务,Part 2
- 基于jsp+servlet+javabean的MVC模式简单应用
- sql里的null和空的区别
- CSS Box Model 盒子模型
- python中一个py文件如何调用其他py文件中的类和函数
- go 0000
- mini2440串口使用
- 213. House Robber II(动态规划)
- WebRTC 零基础开发者教程(中文版)下载
- 转载——githup的提交
- Web Services 根据wsdl生成代理类
热门文章
- C# byte[]转string, string转byte[] 的四种方法
- 1.3 eclipse快捷键
- 关于反射中如何剔除实体类中serialVersionUID字段
- PyCharm 上传项目到码云托管平台
- MySQL中 IS NULL、IS NOT NULL、!= 能用上索引吗?
- DFS(深度优先搜索)
- libcurl库的简介(一)
- MyBatis-Spring整合之方式4
- Spring Boot 编辑器 IDEA 免费许可申请
- Spring Boot Json 之 Jackjson Fastjson