首页 > 代码库 > 设计模式

设计模式

前言

在编程过程中总结归纳出来的一种编程经验,从而形成的设计思想称为设计模式。

设计模式有23种。它适用于所有的编程语言。

常用的有创新型的设计模式:简单工厂、抽象工厂和单例模式;行为型的设计模式:模板设计模式、观察者模式和命令模式;结构性的设计模式:适配器设计模式、代理模式(静态和动态两种,典型的有在spring的AOP编程中使用)和装饰器设计模式。

正文

单例模式(singleton)

保证一个类在内存中只能创建一个实例。

1.实现步骤:

1)将构造器私有化,即使用private修饰构造器

2)提供静态私有的属性,类型为要创建的对象类型。

3)提供一个返回在类内部创建的对象的静态方法。

注:

1.饱汉式的单例模式是等到外界第一次请求对象时才创建对象。

应用场景:对象比较小,创建过程消耗的时间少。

饱汉式是典型的时间换取空间。

饱汉式代码示例:

<script src="https://code.csdn.net/snippets/324808.js" type="text/javascript"></script>

 

2.饿汉式是当程序一启动就立即产生对象加载到内存中。

应用场景:对象比较大,创建过程消耗的时间多。

饱汉式是典型的空间换取时间。

饿汉式代码示例:

<script src="https://code.csdn.net/snippets/324803.js" type="text/javascript"></script>

 

 

简单工厂

对调用者封装对象的创建过程,提供产品。

使用工厂封装对象的创建过程。

1.实现步骤:

1)定义接口规范。

该接口是工厂中创建的对象必须实现的接口。

定义接口的方法时,避免体系技术的特点;比如:对于数据库的操作,避免在接口中适应SQLException.

2)定义实现类

该类是工厂需要创建的对象的模板,实现定义的接口。

3)构建工厂:采用抽象类

在工厂类中提供一个静态方法,方法的返回值类型为接口类型,用于动态绑定工厂中生产出得各种对象。

2.应用场景:

根据用户的不同需要产生不同的对象,这些对象都是同一类型的,且具有相同的行为

3.作用

能适应不同的用户的不同需求,根据不同的需求产生对应的对象,达到屏蔽对象的创建过程的目的。

4.简单工厂与放射结合使用的实现步骤

1)定义接口

2)提供具体的实现类

3)提供配置文件

配置类的基本信息:key="类的全限定名"

4)提供工厂类的实现

根据配置文件信息,通过外界传来的key,获取对应的全限定名。

代码示例:

<script src="https://code.csdn.net/snippets/324757.js" type="text/javascript"></script>

 

抽象工厂

抽象工厂用于不同产品的实现;比如一些易于交换产品系列,它们只需改变具体工厂即可。

例如:一个开发中可能有mySql的数据库和oracle的数据库。

1.具体示例步骤:

1)定义接口

定义访问数据库的方法

IOrderDao-->addOrder方法//用户访问方式

IUserDao-->addUser方法////订单的访问方式

注:

访问数据库的方式与数据库产品无关,只和业务有关。

2)提供接口的实现:抽象产品的具体分类实现

不同的数据库产品他的操作方式不同

1))针对oracle的实现

OracleUserDaoImpl implements IUserDao

OracleOrderDaoImpl implements IOrderDao

 

2))针对mySql的实现MySqlUserDaoImpl implements IUserDao

MySqlOrderDaoImpl implements IOrderDa

3)提供抽象工厂类

该类应该包含所有的创建数据库产品的工厂的抽象方法

<script src="https://code.csdn.net/snippets/324786.js" type="text/javascript"></script>

 

4)针对不同的数据库产品提供数据库的工厂

 

<script src="https://code.csdn.net/snippets/324794.js" type="text/javascript"></script>
5)测试:通常在运行时刻创建一个ConcreteFactory类的实例
    DaoFactory daoFacotry=DaoFactory.getInstance("mysql");
    UserDao userDao=daoFactory.getUserDao();
注:
创建具体的工厂,再创建具有特定实现的产品对象。也就是说,为了创建不同的产品对象,客户端应使用不同的具体工厂。

 

模板设计模式(Template)

在一个类中定义操作的骨架,细节交给子类完成

 开发步骤:
      1.定义一个抽象类
                 |-定义算法的骨架(方法实现的半成品)
                 |-定义一个抽象方法由抽象类当中的实例方法调用同时交给子类来实现。

应用场景:

 jdbc操作数据库的更新与删除

<script src="https://code.csdn.net/snippets/324855.js" type="text/javascript"></script>

 

原理:

子类重写父类的方法

定义算法框架在一个方法里,某些步骤推迟到子类。模板方法设计模式让子类定义算法的某些步骤,而不需要改变算法的结构。

代码示例:

2)抽象类的骨架

<script src="https://code.csdn.net/snippets/324859.js" type="text/javascript"></script>
1)子类实现骨架的某些步骤
 
<script src="https://code.csdn.net/snippets/324868.js" type="text/javascript"></script>

 

装饰器设计模式(decorator)

1.意图在运行时通过组合操作产生新的变化。IO流中的输入输出就是一个典型案例

装饰器动态的给对象增加职责。装饰器提供了一个比继承更好地弹性的方案。

代码示例:

<script src="https://code.csdn.net/snippets/325042.js" type="text/javascript"></script>

 

2.装饰者可以在被委托的对象之前或之后,把它的行为加上,以便完成剩下的任务。
当然,它的缺点是造成大量的小类

3.原理:装饰器为被装饰器提供装饰的原料。

举例:节点文件流是装饰器,文件流获取的数据来填充缓冲流中的缓冲池,文件中的数据来修饰缓冲池。

代码示例:

1)类结构

 

2)Person接口

<script src="https://code.csdn.net/snippets/325074.js" type="text/javascript"></script>

 

3)Man实现了

<script src="https://code.csdn.net/snippets/325078.js" type="text/javascript"></script>

 

4)Decorator适配器类

<script src="https://code.csdn.net/snippets/325085.js" type="text/javascript"></script>

 

5)适配器的子类DecA

<script src="https://code.csdn.net/snippets/325096.js" type="text/javascript"></script>

 

6)适配器的子类DecB

<script src="https://code.csdn.net/snippets/325097.js" type="text/javascript"></script>
7)测试类
<script src="https://code.csdn.net/snippets/325105.js" type="text/javascript"></script>

 

适配器设计模式(adapter)

经常使用一些support或adapter的单词来表示适配器的类。

在jdk的swing中的事件监听器应用了该设计模式。

1.使原来由于接口不兼容的类在一起协同工作

代码示例:a类和b类的接口不兼容,一起协同工作的实例

1)A类的接口

<script src="https://code.csdn.net/snippets/324897.js" type="text/javascript"></script>
2)A类的代码
<script src="https://code.csdn.net/snippets/324903.js" type="text/javascript"></script>
3)B类的代码
<script src="https://code.csdn.net/snippets/324907.js" type="text/javascript"></script>
4)测试类
<script src="https://code.csdn.net/snippets/324914.js" type="text/javascript"></script>

 

2.适配器的类
 *    |-初始化一些资源,直接提供给子类使用
 *    |-子类可以只关心功能,需要实现什么功能重写什么方法

代码示例:

1)接口包含了很多的方法

<script src="https://code.csdn.net/snippets/324921.js" type="text/javascript"></script>
2)通过继承实现了接口的类,来解决必须重写所有的接口方法的问题
<script src="https://code.csdn.net/snippets/324929.js" type="text/javascript"></script>
3)子类可以只关心功能,需要实现什么功能重写什么方法
<script src="https://code.csdn.net/snippets/324941.js" type="text/javascript"></script>
 

 

总结

1.简单描述一下其他的设计模式:

1)状态设计模式:允许对象在内部的状态改变时,改变它的行为。达到对象看起来就像修改了它的类的效果。

2)策略模式:定义一组算法家族,封装每个算法并使之可互换。策略模式让客户可以独立地应对算法的变化。

3)观察者模式:定义一对多的关系,当一个对象改变时,所有的依赖者都会自动得到通知和更新。它在jdk中的应用有javaBean和swing。