设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

  

一、设计模式的分类

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下:

二、设计模式的六大原则

1、开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

3、依赖倒转原则(Dependence Inversion Principle)

这个是开闭原则的基础,具体内容:面向接口编程依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

5、迪米特法则(最少知道原则)(Demeter Principle)

为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立

6、合成复用原则(Composite Reuse Principle)

原则是尽量使用合成/聚合的方式,而不是使用继承。

三、Java中具体的设计模式

 

1.简单工厂模式(Simple Factory)

  根据提供给它的参数,返回的是几个可能产品中的一个类的实例。

  

①Sender接口

package No1_SimpleFactory;

public interface Sender {
public void send(); }

  接口中定义了一个Send 方法。

②MailSender类,实现了Sender接口

package No1_SimpleFactory;

public class MailSender implements Sender
{
public void send()
{
System.out.println("发送邮件");
} }

③MessageSender类,实现了Sender接口

package No1_SimpleFactory;

public class MessageSender implements Sender
{
public void send()
{
System.out.println("发送短信 ");
} }

④创建SendFactory工厂类

package No1_SimpleFactory;

public class SendFactory {
public Sender produce(String type)
{
if("mail".equals(type))
{
return new MailSender();
}
else if("message".equals(type))
{
return new MessageSender();
}
else
{
System.out.println("请输入正确的类型");
return null;
}
} }

  在SendFactory中定义了一个Sender类型的方法produce(),这个方法可以根据提供给它的参数,返回一个Sender类型的实例。

⑤测试

package No1_SimpleFactory;

public class SimpleFactoryTest
{
public static void main(String[] args)
{
SendFactory factory = new SendFactory();
Sender sender1 = factory.produce("mail");
sender1.send();
}
}

输出的结果为:

发送邮件
发送短信

2.多个工厂方法模式

  在普通工厂模式中,如果传递的字符串出错,则不能创建对象,而多个工厂方法模式提供多个工厂方法,分别创建对象:

  接口和连个实现接口的类保持不变。

④SendFactoy类

package No2_duogeFactory;

public class SendFactory
{
public Sender produceMail()
{
return new MailSender();
} public Sender produceMessage()
{
return new MessageSender();
} }

  提供了多个工厂方法,用来分别创建对象。

⑤测试

package No2_duogeFactory;

public class FactoryTest
{
public static void main(String[] args)
{
SendFactory factory = new SendFactory();
Sender sender = factory.produceMail();
sender.send();
Sender sender1 = factory.produceMessage();
sender1.send();
} }

输出结果:

发送邮件
发送短信

3.静态工厂模式

  将上面的多个工厂方法模式里的方法设置为静态的,不需要创建实例,直接调用即可。

①②③接口和连个实现接口的类保持不变。

④SendFactory类

package No2_duogeFactory;

public class SendFactory
{
public Sender produceMail()
{
return new MailSender();
} public Sender produceMessage()
{
return new MessageSender();
}
}

⑤测试

package No2_duogeFactory;

public class FactoryTest
{
public static void main(String[] args)
{
SendFactory factory = new SendFactory();
Sender sender = factory.produceMail();
sender.send();
Sender sender1 = factory.produceMessage();
sender1.send();
}
}

  这三种工厂方式比较起来,大多数情况下,会选择静态工厂方法模式。

4.抽象工厂模式(Abstract Factory)

  工厂模式存在的问题:类的创建依赖工厂类,如果需要拓展程序,就需要对工厂类进行修改,违背了闭包原则,所以抽象工厂模式,创建多个工厂类,这样一旦新增加功能,直接增加新的工厂类即可,不需要修改之前的代码。

  

①Sender接口

public interface Sender
{
public void Send();
}

②MailSender类实现这个接口

public class MailSender implements Sender
{
public void Send()
{
System.out.println("发送邮件");
}
}

  

③MessageSender类实现这个接口

public class MessageSender implements Sender
{
public void Send()
{
System.out.println("发送短信");
}
}

  

 Provider类接口,包含以Sender作为返回类型的方法

public interface Provider
{
public Sender produce();
}

⑤SenderMailFactory类实现这个接口,返回一个MailSender的实例

public class SendMailFactory implements Provider
{
public Sender produce()
{
return new MailSender();
}
}

  

⑥SenderMessageFactory类实现这个接口,返回一个MessageSender的实例

public class SendMessageFactory implements Provider
{
public Sender produce()
{
return new MessageSender();
}
}

⑦测试

public class FactoryTest
{
public static void main(String[] args)
{
Provider provider = new SendMailFactory();
Sender sender = provider.produce();
sender.Send();
}
}

输出结果:

发送邮件

5.单例模式(Singleton)

  单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。

  1.某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销;

  2.省去了new操作符,降低了系统内存的使用频率,减轻GC压力;

  3.有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统会混乱,所以只能使用单例模式,才能保证核心交易服务器独立控制整个流程。

①最简单的单例模式的类

public class Singleton
{
private static Singleton instance = null; private Singleton(){
} public static Singleton getInstance()
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
} public Object readResolve()
{
return instance;
}
}

  这是最简单的单例模式的类,但是没有线程安全保护,如果放入到多线程的环境中,会出现问题,为了解决这个问题,对getInstance方法加上synchronized关键字。

②对getInstance加上synchronized关键字

public class Singleton_syn
{
//持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载
public static Singleton_syn instance = null; //私有构造方法,防止被实例化
private Singleton_syn(){
} public static synchronized Singleton_syn getInstance()
{
if(instance == null)
{
instance = new Singleton_syn();
}
return instance;
} public Object readResolve()
{
return instance;
}
}

  使用synchronized关键字锁住的是这个对象,这样的用法在性能上会下降,因为每次调用getInstance()方法的时候,都会对对象上锁。事实上,只有在第一次创建对象的时候需要枷锁,之后不需要,所以,在此处需要进行改动。

  

java — 设计模式的更多相关文章

  1. java设计模式- (1)单例模式

    参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...

  2. JAVA 设计模式 桥接模式

    用途 桥接模式 (Bridge) 将抽象部分与实现部分分离,使它们都可以独立的变化. 桥接模式是一种结构式模式. 结构

  3. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  4. Java设计模式之行为型模式

    行为型模式共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 策略模式:策略模式的决定权在用户,系统本身提供不同 ...

  5. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  6. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  7. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  8. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  9. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

  10. JAVA 设计模式 状态模式

    用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构

随机推荐

  1. jdk11新特性

    JDK 11主要特性一览 jdk11即将在9月25号发布正式版.确定的新特性包括以下17个 181 嵌套类可见性控制 309 动态文件常量 315 改进 Aarch64 Intrinsics 318 ...

  2. windows 10 安装node.js

    第一步:下载软件 nodejs的中文官网http://nodejs.cn/download/ 选择 windows  系统 msi 安装版本. 下载完成之后,直接打开下一步安装就可以. 安装完成 打开 ...

  3. python基础 - 字符串与列表的基本操作方法

    # v = 11# data = v.bit_length()# print(data) # a = 'ABCDEFGHIJK'# print(a[0])# print(a[10]) # print( ...

  4. Linux的基础命令大全

    linux的基础命令大全 1.shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器) ls -al /bin/sh   ls -al /bin/bash 查看这些shell的 ...

  5. Python基础、条件语句和基本数据类型

    1. 第一句python - 后缀名是可以是任意? - 导入模块时,如果不是.py文件 ==> 以后文件后缀名是 .py 2. 两种执行方式 python解释器 py文件路径 python 进入 ...

  6. linux——制作本地yum源

    1. 将windows系统中的linux镜像插入到linux系统的光驱中 2. 将光驱挂载到一个挂载点 3. 清缓存:yum clean all 4. 修改配置文件 /etc/yum.repos.d/ ...

  7. AtCoder Regular Contest 098 D - Xor Sum 2 区间异或=相加 DP思想

    题意:给出n个数,求它的连续子序列中,满足下列公式,(l,r)的对数有多少对 Al xor Al+1 xor … xor Ar=Al + Al+1 + … + Ar 思路:由题意可以得到,连续子序列, ...

  8. python2.7入门---CGI编程&文件上传&文件下载

        这次我们来看下文件下载和上传的操作.首先是上传,HTML设置上传文件的表单需要设置 enctype 属性为 multipart/form-data,代码如下所示: <!DOCTYPE h ...

  9. Git Status 中文乱码解决

    现象: jb@H39:~/doc$ git statusOn branch masterYour branch is up-to-date with 'origin/master'. Untracke ...

  10. WMI、WQL语言、WQL测试工具wbemtest.exe

    Windows Management Instrumentation (WMI) 是 Windows 操作系统的一个组件,允许通过编程方式访问应用程序.服务和其他计算机组件的管理信息(例如,配置设置和 ...