设计模式-基本概述+单例模式+工厂模式+适配器模式+策略模式

一、设计模式概述

1.设计模式使用原因:
在面向对象的软件设计中,总是希望避免重复设计或尽可能少做重复设计。
不是解决任何问题都要从头做起,复用以前使用过的解决方案可以帮助设计者更快更好地完成系统设计。

设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。设计模式帮助开发者做出有利于系统复用的选择,避免设计损害了系统复用性。通过提供一个显式类和对象作用关系以及它们之间潜在联系的说明规范,设计模式甚至能够提高已有系统的文档管理和系统维护的有效性。

设计模式提供了用面向对象的思想设计不同系统、不同应用时经常发生的问题的解决方案,向软件设计人员提供解决特定问题的可依据的方法蓝图,可以帮助设计者更快更好地完成系统设计。
“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。(模式语言之父:Christopher Alexander)

2.一个模式有四个基本要素:
模式名称(pattern name)
问题(problem)
解决方案(solution)
效果(consequences)

3.创建型模式
单例模式(Singleton)
工厂方法(FactoryMethod)
抽象工厂(AbstractFactory)
建造者模式(Builder)
原型模式(Prototype)

4.结构型模式
适配器模式(Adapter)
桥接模式(Bridge)
组合模式(Composite)
装饰模式(Decorator)
外观模式(Facade)
享元模式(Flyweight)
代理模式(Proxy)

5.行为型模式
策略模式(Strategy)
观察者模式(Observer)
责任链模式(Chain of Responsibility)
命令模式(Command)
解释器模式(Interpreter)
迭代器模式(Iterator)
中介者模式(Mediator)
备忘录模式(Memento)
状态模式(State)
模板方法(TemplateMethod)
访问者模式(Visitor)

二、单例模式

1.单例模式分为懒汉式和饿汉式:
懒汉式,需要用的时候再创建对象。优点是提前创建好了对象。缺点是线程不安全。
饿汉式,对象是一开始就创建好。优点是线程安全,缺点是对象加载时间长。

2.单例模式示例:
很多时候都需要保证一个类仅有一个实例:
整个应用程序中只有一个连接数据库的Connection实例;
操作系统只需要一个时钟;
对于建模固定不变信息的类,仅需访问一个实例;
使用某个类来维护增量计数器时,此简单的计数器类需要跟踪在多个应用程序领域中使用的整数值。
3.单例模式代码:

public class Singleton {
	private Singleton(){}
	//注意这是private 只供内部调用
	private static Singleton instance = new Singleton();
	//这里提供了一个供外部访问本class的静态方法,可以直接访问
	public static Singleton getInstance() {
		return instance;
	}
}

public class Singleton {
	private static Singleton instance = null;
	public static synchronized Singleton getInstance() {
		//使用时生成实例,提高了效率!
		if (instance==null)
			instance=new Singleton();
		return instance; 
	}
}

4.总结:什么情况下使用单一实例模式?
需求描述:希望整个应用程序中只有一个连接数据库的Connection实例;
一个类有属性信息,但是其所有的属性信息的值是唯一的,而且只能访问,不能修改,可以考虑用单一实例模式。
一个类没有属性信息,只有方法,可以考虑用单一实例模式。

三、工厂模式

1.问题的引出:
生产各种类型的手机:随着时间的过去,生产的品种发生变化。

public class Factory{
	public static Sample creator(int which){
	//getClass 产生Sample 一般可使用动态类装载装入类。
	if (which==1)
		return new SampleA();
	else if (which==2)
		return new SampleB();
	}
}

在程序中,如果要实例化Sample 时。就使用Sample sampleA=Factory.creator(1);
这样,在整个就不涉及到Sample 的具体子类,达到封装效果,也就减少错误修改的机会。

工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;把改变的内容进行封装,使他们不会干扰应用的其他部分;该工厂类可能会被除了Manufacturer类的其他类使用;

使用继承机制,把对象的创建委托给子类,子类实现工厂方法来创建对象;与工厂方法相比,实现了可扩展,应用于产品结构更复杂的场合,由一个工厂类负责具体类的实例化,变成由一群子类来负责实例化,易于扩展不同类型的工厂。

2.几种工厂:
1)简单工厂
在这里插入图片描述
在这里插入图片描述

2)工厂方法
在这里插入图片描述

在这里插入图片描述
3)抽象工厂
在这里插入图片描述

在这里插入图片描述

四、适配器模式

1.适配器图和基本元素:
在这里插入图片描述
Client: 客户,有请求
Adaptee :被适配者,所有的请求都委托给被适配者完成
Target: 目标抽象类,定义客户要用的请求接口
Adapter: 适配器,调用被适配者的接口,实现目标中
用户请求的接口

2.客户使用适配器的过程如下:
客户通过目标接口调用适配器的方法对适配器发出请求;
适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口;
客户接受到调用的结果,但并未察觉这一切是适配器在起转换作用。
适配器将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
3.适配器模式的注意事项和细节:
在这里插入图片描述

五、策略模式

1.基本介绍:
策略模式(Strategy Pattern)中,定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用的算法。
2.策略模式的注意事项和细节:
1)策略模式的关键是分析项目中变化部分和不变部分;
2)策略模式的核心思想是:多用组合/聚合,少用继承;用行为类组合,而不是行为的继承,更有弹性;
3)体现了对修改关闭,对扩展开放的原则。客户端增加行为不用修改源代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if else);
4)提供了可以替换继承关系的办法:策略模式将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使他易于切换,理解,扩展;
5)需要注意的是,每增加一个策略就要增加一个类,当策略过多会导致类数目庞大。
3.Strategy背后的思想
1)是将各种策略封装在一个模块中,并提供一个简单的接口来允许在这些策略之间进行选择。
2)整个Strategy的核心部分就是接口的使用,使用Strategy模式可以在用户需要变化时,修改量很少,而且快速。
Context类维护一个名为strategy的引用,指向strategy类型的对象。
Context类包含方法setStrategy,它允许客户端代码指定所需的算法。
类Context包含方法invokeStrategy,客户端代码在需要执行算法时调用该方法。
4.总结:什么情况下使用策略模式?
在很多情况下,我们希望用不同的方法来做同样的事情。
保存不同格式的文件。
使用不同的算法压缩文件
使用不同的压缩方案捕获视频数据
使用不同的断行策略来显示文本数据。
用不同的格式绘制相同的数据:折线图、柱状图或饼图。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值