单例设计模式
单例设计模式原理(保证对象唯一性):
1、 为了避免其他程序过多建立该对象,铁饭碗禁止其他程序建立该类对象
2、 还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象
3、 为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式
对应的设计步骤:
1、 将构造方法私有化
2、 在类中创建一个本类对象
3、 提供一个方法可以获取到该对象
事例:
public class SimpleDemo
{
public static void main(String[] args)
{
Student st1 = Student.getInstance();
Student st2 = Student.getInstance();
System.out.println(st1 == st2);
}
}
class Student
{//这个是先初始化,饿汉式
private Student() {}
//而静态方法里面操作的都是静态的变量且st是成员变量所有设成private static
private static Student st = new Student();
//由于无法通过对象来访问这个方法,所以设成静态的
public static Student getInstance() {
return st;
}
}
单例的另外一种写法:
class Student
{//这个是后初始化,对象的延时加载,懒汉式
private static Student st = null;
private Student() {}
public static Student getInstance() {
if (st == null) //******* A B
st = new Student();
return st;
}
}
如果是懒汉式的话,就存在着多线程的问题,可能会在***号处出现线程的交替,可能会产生两个对象
使用的解决方法有双重决断,在程序员面试的时候考的比较多,但实际开发中用饿汉式,安全而且代码量少
class Student
{
private static Student st = null;
private Student() {}
public static Student getInstance() {
if (st == null) {
synchronized(Student.class) {
if (st == null) {
st = new Student();
}
}
}
return st;
}
}
此处的synchronized()所使用的参数(即锁对象)是方法所在类的字节码文件对象,是因为所操作的成员变量是static的,默认使用的锁是Student.class,因此这样才能使其达到同步的效果,而且没有安全隐范。
模版方法模式
应用举例:
/*
需求:编写一个获取程序运行时间的程序
方法:使用开始运行时间减去结束运行时间
获取时间:System.currentTimeMillis()
什么是模版方法呢?
在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,由该类的子类去完成。
*/
class GetTime
{
public void getTime() {
long start = System.currentTimeMillis();
/****中间的代码不确定****/
for(int i = 1; i < 1000; i++) {
System.out.print(i);
}
/****中间的代码不确定****/
long end = System.currentTimeMillis();
System.out.println("\n毫秒:" + (end - start));
}
}
public class TemplateDemo
{
public static void main(String[] args)
{
GetTime gt = new GetTime();
gt.getTime();
}
}
由于GetTime类中间的代码是不确定的,所以我们用另外一个方法将其封装起来,增加runCode()方法
class GetTime
{
public void getTime() {
long start = System.currentTimeMillis();
/****中间的代码不确定****/
runCode();
/****中间的代码不确定****/
long end = System.currentTimeMillis();
System.out.println("\n毫秒:" + (end - start));
}
public void runCode() {
for(int i = 1; i < 1000; i++) {
System.out.print(i);
}
}
}
一般是不建议修改已有的代码,如果还有另外的一段代码需要获取运行时间,我们用写另外一个类继承GetTime类
class SubClass extends GetTime
{
public void runCode() {
for(int i = 1; i < 4000; i++) {
System.out.print(i);
}
}
}
此处我们只需要重写一个runCode()方法就能够获取相应代码的运行时间,增加了程序的复用性
由于GetTime类只实现一个功能,而且是固定的,此处我们可以让别人不能重写我们的getTime()方法,而runCode()是里面是不需要写实现的,那我们定义其为静态方法,而类相应的也要改成静态的,修改后的GetTime类如下:
abstract class GetTime
{
public final void getTime() {
long start = System.currentTimeMillis();
/****中间的代码不确定****/
runCode();
/****中间的代码不确定****/
long end = System.currentTimeMillis();
System.out.println("\n毫秒:" + (end - start));
}
public abstract void runCode();
}
分享到:
相关推荐
具体实现了一个计算器的代码,首先计算器应该具备对两个数字进行运算的功能,而运算的方法可以有很多种(最基础的有加,减,乘,除), 并且代码易于移植,这里是个console的应用台界面,也应该可以直接移植到MFC...
分支微服务设计模式是一种扩展的聚合器模式,允许同时调用两个微服务链。在这种情况下,数据共享微服务设计模式可以用于解决单体应用到微服务架构的过渡阶段中可能出现的数据重复和不一致问题。 数据共享微服务设计...
本电子书一共两个压缩文档,本文件为part2. 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,...
运用两个典型案例,实现软件设计模式的简单工厂模式,从该案例中,可以体会简单工厂模式的特点
本电子书一共两个压缩文档,该文档为part1。 《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等...
设计模式之解释器模式的Java版本实现和UML类图设计
解释器模式将描述怎样 在 有了一个简单的文法后, 使用模式设计解释这些语句。 在解释器模式里面提到的语言是指任 何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表 文法的命令类的等 级结构,也...
1、 IOS设计模式的六大设计原则之单一职责原则(SRP,Single Responsibility Principle) 定义 就一个类而言,应该仅有一个引起它变化的原因。 定义解读 这是六大原则中最简单的一种,通俗点说,就是不存在多个...
情景记忆:两个人在聊天。一个问:这家**工厂**是干什么的?另一个说:**造 圆型 丹**药的。5个。 **结构型模式(Structural Pattern)**:关注于对象的组成以及对象之间的依赖关系,描述如何将类或者对象结合在...
GoF 的 23 种设计模式的分类,现在对各个模式的功能进行介绍。 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一...
1、工厂方法模式 1.1 作业题目 使用工厂方法模式重构上个学期的简易四则计算器(带用户界面),并在原有...网站计算器是web应用程序的一项基本功能,用于统计使用网站的人数,可反应出网站的受欢迎程序,请设计一个简单的w
下面使用简单工厂模式实现一个简单的四则运算 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' ''' 大话设计模式 用任意一种面向对象语言实现一个计算器控制台程序。要求输入两个数和运算符号,...
5.4.4Java实例——两个迭代器 211 5.4.5优势和缺陷 213 5.4.6应用情景 214 5.5MediatorPattern(中介者模式) 214 5.5.1定义 214 5.5.2现实示例——机场控制塔 215 5.5.3C#实例——聊天室 216 5.5.4Java实例...
请用Java面向对象语言,利用简单工厂模式,实现简易计算器程序(加减乘除功能)。 在注释中回答以下问题: 1、 软件设计目标分别是什么? 2、 在相应的代码处解释设计目标实现的方式。
5.4.4Java实例——两个迭代器 211 5.4.5优势和缺陷 213 5.4.6应用情景 214 5.5MediatorPattern(中介者模式) 214 5.5.1定义 214 5.5.2现实示例——机场控制塔 215 5.5.3C#实例——聊天室 216 5.5.4Java实例...
c#编的两个例子,非常适合初学者学习,一定要掌握设计模式的内涵,简单,但能反映出很多内容,
4、网站计算器是web应用程序的一项基本功能,用于统计使用网站的人数,可反应出网站的受欢迎程序,请设计一个简单的web页面(java,asp.net均可),并为该页面设计一个计算器,用来统计当前访问网址的用户数。
在学习抽象工厂设计模式之前,要先知道简单工厂模式 众所周知,从结构可以看出,简单工厂模式中的工厂依赖于所有的子类产品,客户只需知道父类产品和工厂即可。工厂是整个模式的核心,以不变应万变。它虽然使对象的...