上一篇为大家介绍了一下设计模式中的责任链模式,本篇为大家介绍一下关于设计模式中的单例模式与模板方法模式。单例模式的作用在于,保证应用中某个实例有且只有一个,单例模式又被分为:饱汉模式与饿汉模式,两者的区别在于饿汉模式没有显式给出对象的实例话。下面我们就一起先了解一下单例模式的中的饱汉模式和饿汉模式。

 1、饱汉模式:

  在我们创建对象时一般JAVA会默认为我们提供一个默认的构造方法,单例模式既然要保证程序中某个对象只有一个实例化,所以我们要把我们的构造方法定义为:private私有的,那我们在程序中如何获得该对象呢?这是我们对外提供一个获得该对象实例的方法,当外部需要获得实例对象时,通过类调用该方法获得。

/*
* 单例模式---饱汉模式
* 保证整个应用程序中某个实例有且只能有一个
*/
public class One { //第一步定义一个无参构造方法,私有化,不允许外部直接创建对象
private One(){
} //定义一个One对象
private static One one = new One(); //提供一个外部调用对象的方法,通过static将该方法定义为全局方法
public static One getOne(){
return one;
} }

 2、饿汉模式:

  饿汉模式的思想和饱汉模式基本相同,只不过饿汉模式没有提供显式的对象实例。

/*
* 单例模式---懒 汉模式
* 单例模式的作用:保证整个应用程序中某个实例有且只能有一个
*/
public class Two { //第一步定义一个无参构造方法,私有化,不允许外部直接创建对象
private Two(){
} //声明一个Two对象
private static Two two; //提供一个外部调用对象的方法,通过static将该方法定义为全局方法
public static Two getTwo(){
if(two==null){
two = new Two();
}
return two;
}
}

 3、测试:

public class Test {

    /**
* @param 模式测试
*/
public static void main(String[] args) { //饱汉模式
One one1 = One.getOne();
One one2 = One.getOne();
if(one1==one2){
System.out.println("两个对象一致");
}else{
System.out.println("两个对象不一致");
} //饿汉模式
Two two1 = Two.getTwo();
Two two2 = Two.getTwo();
if(two1==two2){
System.out.println("两个对象一致");
}else{
System.out.println("两个对象不一致");
} } }

  结果:

  


  下面我们一起来学习一下,关于模板方法模式的知识,模板方法模式就如同我们在设计建筑时,我们在保持传统设计工艺的基础上,对一些地方进行设计创新,最终达到我们理想的设计效果。

  如何为大家介绍呢?下面我们就以一个饮料机为原型为大家介绍一下模板方法模式。假定我们的饮料机可以出两种饮料:一种咖啡,另一中绿茶,这两种饮料都有提神的功效,是程序猿的必备。哈哈,这是你拿这杯子来到饮料机前,点击我要一杯咖啡,这是饮料机就为您提供一杯咖啡;当你点击我要一杯绿茶时,饮料机就为我们提供了一杯绿茶。这是怎么一回事呢?下面我们用代码实现一下:

 1、创建一个饮料机类:

/*
* 模板方法模式
*/
public abstract class Robot {
public void ZhuShui(){
System.out.println("把水煮沸");
}
public abstract void Chong();
public void DaoShui(){
System.out.println("把饮料倒入杯子中");
}
public abstract void Add();
}

 2、创建一个咖啡机类:

public class Coffer extends Robot {

    public void Add() {
System.out.println("加牛奶");
} public void Chong() {
System.out.println("冲咖啡");
} }

 3、创建一个绿茶机类:

public class Tea extends Robot {

    public void Add() {
System.out.println("加柠檬");
} public void Chong() {
System.out.println("冲泡茶叶");
} }

 4、测试代码:

public class Test {

    /**
* @param 模板方法模式测试
*/
public static void main(String[] args) {
Robot robot1 = new Coffer();
robot1.ZhuShui();
robot1.Chong();
robot1.DaoShui();
robot1.Add(); System.out.println("**********************"); Robot robot2 = new Tea();
robot2.ZhuShui();
robot2.Chong();
robot2.DaoShui();
robot2.Add(); } }

  测试结果:

  

  Ok到这里关于JAVA中模式的单例模式和模板方法模式就为大家介绍完毕。下一篇:适配器模式与工厂方法模式

  

JAVA设计模式《二》的更多相关文章

  1. Java 设计模式(四)-工厂方法模式 (FactoryMethod Pattern)

    1     概念定义 1.1   定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 1.2   类型 创建类模式 2     原理特征 2.1   类 ...

  2. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  3. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  4. 深入探索Java设计模式(四)之享元模式

    享元模式适用于需要大量相同类型对象的情况.在此,设计布局可以减少创建多个对象的方式.对象在运行时会消耗资源,因此最好在内存中使用较少的对象.它减少了内存占用并利用了程序的整体性能.本文是在学习完优锐课 ...

  5. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 分析Linux内核创建一个新进程的过程

    一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct ...

  2. javascript练习-方法借用

    方法借用其实也可以叫做多重继承 var generic = { //返回一个字符串,这个字符串包含构造函数的名字(如果构造函数包含名字) //这个以及所有非继承来的,非函数属性的名字和值 toStri ...

  3. js获取倒计时

    <html> <head> <title>出错啦~~~</title> <link href="css/login1.css" ...

  4. Linux初记

    ctrl+u可以在shell下删除行,如果此键不起作用,就试试ctrl+x ctrl+z可以将程序挂起,不会终止程序,但可以将程序挂起. 通过fg命令可再把此作业切换到前台 cp命令的目标文件如果是一 ...

  5. Strong name signature not valid for this assembly Microsoft.mshtml.dll

    Strong name signature not valid for this assembly Microsoft.mshtml.dll  http://social.msdn.microsoft ...

  6. C++ 非阻塞套接字的使用 (2)

    继续话题——软件中的异步非阻塞通讯方式. 由于软件基于MFC开发,所以实现异步通讯时使用了CAsyncSocket类. 首先要了解CAsyncSocket异步机制,引用自 http://blog.cs ...

  7. highcharts 不显示X轴 Y轴 刻度

    xAxis: { tickWidth:0,        //设置刻度标签宽度 lineColor:'#ffffff',//设置坐标颜色 lineWidth:0,        //设置坐标宽度 la ...

  8. 如何安全地关闭MySQL实例

    如何安全地关闭MySQL实例 转载自:http://imysql.com/2014/08/13/mysql-faq-howto-shutdown-mysqld-fulgraceful.shtml 本文 ...

  9. TypeScript之基本数据类型

    前言 最近项目很急,所以没有什么时间回答关于Xamarin.Android方面的问题,也有一段时间没有更新.主要是手头很缺人,如果有谁有兴趣加入我们的话,可以私聊我,这样我就能继续造福社区了,同时还有 ...

  10. 【C语言学习】《C Primer Plus》第6章 C控制语句:循环

    学习总结 1.循环的语法跟其他语言的没差多少,可能大多数语言都在C的基础上发展出来的,所以大同小异不奇怪. 2.在判断表达式里,C语言只有0被认为是假,所有非零值正整数都被认为真. #include ...