单例设计模式
单例设计模式原理(保证对象唯一性):
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...
软件开发设计模式又可以进一步分为两类:通用面向对象设计模式和基于Java的设计模式。通用面向对象设计模式,如工厂模式(Factory Pattern),是一种面向对象的设计模式,它将对象的创建过程封装起来,使得对象可以...
工厂设计模式是面向对象编程中的一种经典设计模式,它的主要目的是为了解耦对象的创建与使用,使得系统在不关心具体实现的情况下能够灵活地创建所需的对象。在这个名为"工厂设计模式简单实例"的资料中,我们可以期待...
2. 设计模式使人们可以更加简单方便地复用成功的设计和体系结构,将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。 3. 设计模式使得设计方案更加灵活,且易于修改。 设计模式的基本要素 ...
分支微服务设计模式是一种扩展的聚合器模式,允许同时调用两个微服务链。在这种情况下,数据共享微服务设计模式可以用于解决单体应用到微服务架构的过渡阶段中可能出现的数据重复和不一致问题。 数据共享微服务设计...
`Circle`和`Square`类是`Shape`的两个具体实现,分别绘制圆形和正方形。`Shape`类还有一个静态方法`Create()`,它根据输入的字符串类型返回相应的形状对象。这种方式使得客户端代码可以动态地选择要创建的对象类型,...
在给定的"简单工厂设计模式小例子"中,我们有一个C#实现的控制台应用程序,该程序模拟了一个简单的计算器。这个计算器能够执行基本的数学运算,如加法(+)、减法(-)、乘法(*)和除法(/)。让我们深入了解一下这...
5. **适配器模式**:将两个不兼容的接口通过适配器进行转换,使得原本不能一起工作的类可以协同工作。适配器模式分为类适配器和对象适配器两种。 6. **代理模式**:为其他对象提供一种代理以控制对该对象的访问。...
6. 适配器模式:允许两个不兼容的接口协同工作。在整合第三方库或API时,适配器可以作为桥梁,使它们能与现有代码无缝对接。 7. 桥接模式:将抽象部分与其实现部分分离,使它们可以独立变化。在PHP中,它常用于解耦...
- 外观模式:提供一个简单的接口,用于访问复杂的子系统。 - 享元模式:减少大量相似对象的内存消耗,通过共享技术实现。 - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 3. 行为型模式: - 职责...
- 适配器模式:将两个不兼容的接口转换为一个可以一起工作的接口。 - 桥接模式:将抽象部分与实现部分分离,使它们可以独立变化。 - 组合模式:允许将对象组合成树形结构,表现“整体-部分”关系。 - 装饰模式:...
本资源“一例读懂设计模式-单例模式、简单工厂模式.zip”旨在帮助初学者通过实例深入理解这两种重要设计模式:单例模式和简单工厂模式。以下是关于这两个模式的详细讲解。 1. **单例模式**: 单例模式是一种限制类...
简单工厂模式是软件设计模式中的一种基础模式,它属于创建型模式,主要解决对象的创建问题,降低了系统与具体创建对象之间的耦合度。在这个学习笔记中,我们将深入理解简单工厂模式的概念、工作原理以及如何在实际...
适配器模式(Adapter Pattern)将两个不兼容的接口转换为可以一起工作的形式;观察者模式(Observer Pattern)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动...
适配器模式使得两个不兼容的接口能够协同工作。在C#中,可以通过类适配器(继承)或对象适配器(包含)来实现接口的转换。 九、桥接模式(Bridge) 桥接模式将抽象部分与实现部分分离,使得它们可以独立变化。在C#...
之道 》,其中很多观点我看了很受启发,以前我也将"设计模式" 看成一个简单的解决方案,没有从一种高度来看待"设计模式"在软 件中地位,下面是我自己的一些想法: 建筑和软件某些地方是可以来比喻的 特别是中国传统建筑...
### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是软件工程领域中一个极为重要的概念,它代表着一系列被广泛接受的解决特定问题的方法。GoF(Gang of Four)所提出的23种设计模式更是...
适配器模式使两个不兼容的接口能够协同工作。在C#中,这可以通过继承或组合实现,允许旧的代码与新的接口兼容,或者让第三方库与现有系统集成。 6. 桥接模式(Bridge): 桥接模式将抽象部分与其实现部分分离,使...
在这个“设计模式(简单工厂模式_排序)手写代码.rar”压缩包中,我们可以期待看到作者针对简单工厂模式和排序算法的实现。简单工厂模式通常用于创建相似类型的对象,而排序则可能涉及到多种不同的算法,如冒泡排序、...
在这个“C#简单登录演示抽象工厂设计模式”的案例中,我们将深入探讨如何在C#中应用这个模式来实现一个登录系统。 首先,让我们理解抽象工厂模式的基本概念。在该模式中,我们定义一个创建对象的接口,但让子类决定...