设计模式(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. Python入门 —— 03GUI界面编程

    GUI(Graphical User Interface) 即图形用户接口,又称图形用户接口. 是指采用图形方式显示的计算机操作用户界面.GUI 是屏幕产品的视觉体验和互动操作部分. "你的 ...

  2. VMWARE虚拟机中CentOs7网络连接

    1.选择网络连接模式 这里选择NAT模式 2.查看虚拟机逻辑地址段 编辑---->虚拟网络编辑器 这里显示的是192.168.40.0 我们本机占用了192.168.40.1,网关是192.16 ...

  3. inotify和epoll

    参考EventHub.cpp 1.初始化inotify int mINotifyFd = inotify_init(); 2.将要监测的目录添加到inotify int result = inotif ...

  4. python学习笔记:第17天 面向对象03 类与类之间的关系

    一.类与类之间的依赖关系 ⼤千世界, 万物之间皆有规则和规律. 我们的类和对象是对⼤千世界中的所有事物进⾏归类. 那事物之间存在着相对应的关系. 类与类之间也同样如此. 在⾯向对象的世界中. 类与类 ...

  5. ubuntu解决网易云无法打开

    最近首次入手ubuntu18 摸索了很久,当然网易云是不可缺少的一部分,在配置好各种环境+程序后,也找到了解决网易云的方法了. 首先安装好网易云 默认情况下需要在终端使用 sudo 才能运行 解决的办 ...

  6. Java-谈谈对Java平台的理解

    问题 谈谈对 Java 平台的理解 Java是解释执行的 这句话对么 程序的编译与解释有什么区别 Java 平台的了解 Java的主要特点是两个, 编写一次到处运行 Write once, run a ...

  7. 教你阅读MSDN英文文档,迅速提升编程能力

    在教大家阅读英文文档之前,首先给大家明确一个概念.C#和.NET的区别? 有一定编程经验的同学应该多多少少知道这方面的概念,但是可能模糊,理解的不一定深刻.我在这里简单给出两者的基本定义: C#:仅仅 ...

  8. pylearn2报错缺少theano.compat.six

    按照官网的顺序下载 会出现缺少theano.compat.six的报错 纠结了一天,各种查,最后终于找到解决方法,theano安装有问题 不能安装最新版本,即pip的时候theano==0.7.0,然 ...

  9. 【BZOJ4818】序列计数(动态规划,生成函数)

    [BZOJ4818]序列计数(生成函数) 题面 BZOJ 题解 显然是求一个多项式的若干次方,并且是循环卷积 或者说他是一个\(dp\)也没有问题 发现项数很少,直接暴力乘就行了(\(FFT\)可能还 ...

  10. 北京Uber优步司机奖励政策(2月28日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...