没有合适的资源?快使用搜索试试~ 我知道了~
设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式(11): 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
资源推荐
资源详情
资源评论
23种设计模式详解
JackieZhengChina
已于
2024-06-16 15:39:59
修改
设计模式 的分类
总体来说设计模式分为三大类:
创建型模式(5):
工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式(7):
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式(11):
策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
一、创建模式(5种)
工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
1 工厂模式
1.1 简单工厂模式
定义:定义了一个创建对象的类,由这个类来封装实例化对象的行为。
举例:(我们举一个pizza工厂的例子)
pizza工厂一共生产三种类型的pizza:chesse,pepper,greak。通过工厂类(SimplePizzaFactory)实例化这三种类型的对象。类图如下:
内容来源:
csdn.net
作者昵称:
JackieZhengChina
原文链接:
https://admans.blog.csdn.net/article/details/139712494
作者主页:
https://admans.blog.csdn.net
转载 阅读模式
工厂类的代码:
简单工厂存在的问题与解决方法: 简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了开闭原则,所
以,从设计角度考虑,有一定的问题,如何解决?我们可以定义一个创建对象的抽象方法并创建多个不同的工厂类实现该抽象方法,这样一旦需要增加新的功能,直接增加
新的工厂类就可以了,不需要修改之前的代码。这种方法也就是我们接下来要说的工厂方法模式。
1 public class SimplePizzaFactory {
2 public Pizza CreatePizza(String ordertype) {
3 Pizza pizza = null;
4
5 if (ordertype.equals("cheese")) {
6 pizza = new CheesePizza();
7 }
8 else
9 if (ordertype.equals("greek")) {
10 pizza = new GreekPizza();
11 }
12 else
13 if (ordertype.equals("pepper")) {
14 pizza = new PepperPizza();
15 }
16
17 return pizza;
18 }
19 }
内容来源:
csdn.net
作者昵称:
JackieZhengChina
原文链接:
https://admans.blog.csdn.net/article/details/139712494
作者主页:
https://admans.blog.csdn.net
1.2 工厂方法模式
定义:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
举例:(我们依然举pizza工厂的例子,不过这个例子中,pizza产地有两个:伦敦和纽约)。添加了一个新的产地,如果用简单工厂模式的的话,我们要去修改工厂代码,
并且会增加一堆的if else语句。而工厂方法模式克服了简单工厂要修改代码的缺点,它会直接创建两个工厂,纽约工厂和伦敦工厂。类图如下:
OrderPizza中有个抽象的方法:
两个工厂类继承OrderPizza并实现抽象方法:
abstract Pizza createPizza();
1 public class LDOrderPizza extends OrderPizza {
2 Pizza createPizza(String ordertype) {
3 Pizza pizza = null;
4
5 if (ordertype.equals("cheese")) {
6 pizza = new LDCheesePizza();
7 }
8 else
9 if (ordertype.equals("pepper")) {
10 pizza = new LDPepperPizza();
11 }
12
13 return pizza;
14 }
15 }
16
内容来源:
csdn.net
作者昵称:
JackieZhengChina
原文链接:
https://admans.blog.csdn.net/article/details/139712494
作者主页:
https://admans.blog.csdn.net
通过不同的工厂会得到不同的实例化的对象,PizzaStroe的代码如下:
解决了简单工厂模式的问题:增加一个新的pizza产地(北京),只要增加一个BJOrderPizza类:
17
18 public class NYOrderPizza extends OrderPizza {
19 Pizza createPizza(String ordertype) {
20 Pizza pizza = null;
21
22 if (ordertype.equals("cheese")) {
23 pizza = new NYCheesePizza();
24 }
25 else
26 if (ordertype.equals("pepper")) {
27 pizza = new NYPepperPizza();
28 }
29
30 return pizza;
31 }
32 }
1 public class PizzaStroe {
2 public static void main(String[] args) {
3 OrderPizza mOrderPizza;
4
5 mOrderPizza = new NYOrderPizza();
6 }
7 }
1 public class BJOrderPizza extends OrderPizza {
2 Pizza createPizza(String ordertype) {
3 Pizza pizza = null;
4
5 if (ordertype.equals("cheese")) {
6 pizza = new LDCheesePizza();
7 }
8 else
9 if (ordertype.equals("pepper")) {
10 pizza = new LDPepperPizza();
11 }
内容来源:
csdn.net
作者昵称:
JackieZhengChina
原文链接:
https://admans.blog.csdn.net/article/details/139712494
作者主页:
https://admans.blog.csdn.net
其实这个模式的好处就是,如果你现在想增加一个功能,只需做一个实现类就OK了,无需去改动现成的代码。这样做,拓展性较好!
工厂方法存在的问题与解决方法:客户端需要创建类的具体的实例。简单来说就是用户要订纽约工厂的披萨,他必须去纽约工厂,想订伦敦工厂的披萨,必须去伦敦工
厂。 当伦敦工厂和纽约工厂发生变化了,用户也要跟着变化,这无疑就增加 了用户的操作复杂性。为了解决这一问题,我 们可以 把工厂类抽象为接口,用户只需要去找默
认的工厂提出自己的需求(传入参数),便能得到自己想要产品,而不用根据产品去寻找不同的工厂,方便用户操作。这也就是我们接下来要说的抽象工厂模式。
1.3 抽象工厂模式
定义:定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类。
举例:(我们依然举pizza工厂的例子,pizza工厂有两个:纽约工厂和伦敦工厂)。类图如下:
工厂的接口:
工厂的实现:
12
13 return pizza;
14 }
15 }
1 public interface AbsFactory {
2 Pizza CreatePizza(String ordertype);
3 }
1 public class LDFactory implements AbsFactory {
2 @Override
内容来源:
csdn.net
作者昵称:
JackieZhengChina
原文链接:
https://admans.blog.csdn.net/article/details/139712494
作者主页:
https://admans.blog.csdn.net
剩余57页未读,继续阅读
资源评论
JackieZhengChina
- 粉丝: 4w+
- 资源: 288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 模拟题最终版.docx
- Java Web实验报告一:通讯录
- 不同温度下的光谱数据,仅截取550nm-700nm
- 不同温度下的光谱数据,仅截取550nm-700nm
- HengCe-18900-2024-2030全球与中国eMMC和UFS市场现状及未来发展趋势-样本.docx
- 2024第十四届APMCM亚太地区-C题完整论文.pdf
- HengCe-18900-2024-2030中国硬碳负极材料市场现状研究分析与发展前景预测报告-样本.docx
- PHP面向对象与设计模式
- HengCe-2024-2030全球与中国掩模基板市场现状及未来发展趋势-样本
- CSS3制作的聚光灯下倒影文字选装动画特效代码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功