网站首页 > 教程分享 正文
更多java文章与项目资源、毕业设计
关注公众号 程序猿forever
抽象工厂模式
- 6-1 抽象工厂讲解
- 6-2 抽象工厂coding
- 6-3 抽象工厂源码解析
6-1 抽象工厂讲解
工厂方法模式针对的就是产品等级结构
而抽象方法模式针对的就是产品族
我们只要在美的产品族里面取空调,取出来的肯定是美的的空调,我们在美的的产品族里面取冰箱,取出来的肯定也是美的的电冰箱,只要我们确定这个产品的产品族和产品等级结构,我们就可以唯一的确定这个产品:
从理论上来说:当一个工厂可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,那这个时候,抽象工厂模式要比工厂方法模式要更为简单,更有效率;
6-2 抽象工厂coding
现在,我们提一个业务场景,现在提出了新的要求:每一个课程不仅仅要有视频,还要有对应的手记,如果用工厂方法的方式来进行扩展的话 ,这个时候,既要有java的手记类,python的手记类,FE的手记类,还有手记的抽象类,手记的工厂,java的手记的工厂,python的手记的工厂,FE的手记的工厂,这个时候,就很容易出现类爆炸的现象;
原来是一个视频是一个课程,现在一个视频加上一个手记是一个课程;
java视频,python视频,fe视频他们属于同一产品等级,都是视频
java手记,python手记,fe手记他们也属于同一产品等级,都是手记
而java手记,java视频他们处于同一产品族,都是java相关的;
同一产品族,我们就看java,还是python还是fe;
同一产品等级,我们就看它是视频还是手记即可;
我们先来创建一个课程工厂:
课程类:
public abstract class Video {
public abstract void produce();
}
123
手记类:
public abstract class Article {
public abstract void produce();
}
123
课程工厂类:
public interface CourseFactory {
/** 获取视频 */
Video getVideo();
/** 获取手记 */
Article getArticle();
}
1234567
现在来创建java产品族的课程工厂:
public class JavaCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return null;
}
@Override
public Article getArticle() {
return null;
}
}
1234567891011
Java视频类:
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("录制Java视频");
}
}
123456
Java手记类:
public class JavaArticle extends Article {
@Override
public void produce() {
System.out.println("编写Java课程手记");
}
}
123456
现在,产品族里面的工厂类就可以这样来写了:
public class JavaCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new JavaVideo();
}
@Override
public Article getArticle() {
return new JavaArticle();
}
}
1234567891011
这里就是把视频工厂和手记工厂合在了一起;作为一个产品族;
我们再来写一个python的产品族的:
PythonArticle类:
public class PythonArticle extends Article {
@Override
public void produce() {
System.out.println("编写Python课程手记");
}
}
123456
PythonVideo 类
public class PythonVideo extends Video {
@Override
public void produce() {
System.out.println("录制Python的视频");
}
}
123456
现在,我们再来创建Python产品族的课程工厂(视频和手记合在了一起):
public class PythonCourseFactory implements CourseFactory{
@Override
public Video getVideo() {
return new PythonVideo();
}
@Override
public Article getArticle() {
return new PythonArticle();
}
}
123456789101112
这个就是现在的类图:
测试:
只要是从Java产品族里面拿的肯定是Java的视频和Java的手记
public class Test {
public static void main(String[]args){
CourseFactory courseFactory = new JavaCourseFactory();
Article article = courseFactory.getArticle();
Video video = courseFactory.getVideo();
/** 只要是从Java产品族里面拿的肯定是Java的视频和Java的手记 */
article.produce();
video.produce();
}
}
12345678910
运行结果:
编写Java课程手记
录制Java视频
这样的话,就可以进行解藕;
在使用抽象工厂的时候,尽量找那种固定程度比较高的,像课程里面的视频和手记,视频和手记都是必须要有的,就可以用抽象工厂模式来解决;
缺点:在新增产品等级的时候,会比较的麻烦;
如果在现有的产品族里面添加新的产品等级,就违背了开闭原则了;
如果我们还要把源码放到课程的这个产品族里面,那么对原来的修改就比较大了;
6-3 抽象工厂源码解析
他们都是在同一个产品族里面;
- 上一篇: 设计模式-抽象工厂模式详解(抽象工厂模式包含的角色)
- 下一篇: 设计模式 | 抽象工厂模式及典型应用
猜你喜欢
- 2024-10-18 设计模式之 抽象工厂(抽象工厂模式的简单应用)
- 2024-10-18 Aha!设计模式(3)-抽象工厂(2)(抽象工厂模式结构图)
- 2024-10-18 Java经典设计模式-抽象工厂模式(抽象工厂模式在spring的应用)
- 2024-10-18 Java高级编程细节——工厂模式之抽象工厂
- 2024-10-18 java与设计模式-简单工厂-工厂方法-抽象工厂
- 2024-10-18 简单工厂,工厂方法,抽象工厂(简单工厂,工厂方法,抽象工厂区别)
- 2024-10-18 Aha!设计模式(1)-抽象工厂(1)(抽象工厂实例)
- 2024-10-18 抽象工厂模式(Abstract Factory)(抽象工厂模式的意图是)
- 2024-10-18 设计模式记录-抽象工厂模式(抽象工厂模式与工厂方法模式)
- 2024-10-18 你还在new对象吗?用个“抽象工厂模式”生产对象它不香吗
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)