「设计模式java单例」java设计模式及应用案例

博主:adminadmin 2023-01-03 16:06:14 966

本篇文章给大家谈谈设计模式java单例,以及java设计模式及应用案例对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java之单例设计模式

设计模式 解决某一类问题最行之有效的方法 (java中有 种通用设计模式)单例设计模式 解决一个类在内存中只存在一个对象 单例设计模式有两种方式 )饿汉式先初始化对象 当类一进内存就创建好对象 )懒汉式对象是方法被调用时才初始化 也叫延时加载 类进内存时 对象还没有存在 只有通过方法调用时 才建立对象 单例设计模式 是想要保证对象的唯一 )为了避免其他程序过多建立该类对象 先禁止其他程序建立该类对象 )还为了让其他程序可以访问到该类对象 只好在本类中自定义一个对象 )为了方便其他程序对自定义对象的访问 可以对外其他一些访问方式 利用这三步进行代码实现 )将构造函数私有化 )在类中创建一个本类对象 )提供一个方法可以获取到该对象提示 在单例设计模式中 事物该怎么描述还怎么描述 当需要将该事物的对象保证在内存中唯一时 加上以上三步即可 代码说明 // )饿汉式[java]class Single{private int num;public void setNum(int num){this num = num;}public int getNum(){return num;}//将构造函数私有化private Single(){}//在类中创建一个本类对象 因为构造函数被私有化 该类不能创建对象 想在外部访问 所以将其静态private static Single s = new Single() //提供一个方法可以获取到该对象 不能创建对象 所以将方法静态 可以通过 (类名 方法名)的形式进行访问public static Single getInstance(){return s;}}class SingleDemo{public static void main(String[] args){//单例的构造函数被静态后不能创建对象 保证对象的唯一 所以通过 (类名 方法名)的形式进行访问Single s = Single getInstance() Single s = Single getInstance() s setNum( ) System out println(s getNum()) //结果 因为Single单例里面对对象和方法进行了静态 数据共享 所以s 的值}}

lishixinzhi/Article/program/Java/hx/201311/26060

java单例设计模式求解惑

class single

{

private single(){}//私有化构造函数

==//不允许外部构造

private static single s = new single();//创建本类对象 !!求解惑,既然是静态,为什么可以创建本类对象呢,静态方法不是随着类的加载而加载的嘛,存在方法去的嘛,为什么可以创建对象了呢,,,很无法理解

//---〉静态只有JVM第一次load single类的时候才会构造signle唯一的对象。至于为什么可以创建本类对象,面向对象的基础,自己想下吧。

public static single getInstance()//静态方法只能调用静态参数,

{

return s;

}

}

但是为什么不允许添加getInstance()呢?

//可以添加的。为什么说不可以呢?

如何写一个标准的Java单例模式

java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。

单例模式有一下特点:

1、单例类只能有一个实例。

2、单例类必须自己自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

首先看一个经典的单例实现。

public class Singleton {

private static Singleton uniqueInstance = null;

private Singleton() {

// Exists only to defeat instantiation.

}

public static Singleton getInstance() {

if (uniqueInstance == null) {

uniqueInstance = new Singleton();

}

return uniqueInstance;

}

// Other methods...

}

Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)

但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。

//////////////////////////////////////////////////////////////////////

验证单例模式的示例

//////////////////////////////////////////////////////////////////////

public class TestStream {

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

// 该类只能有一个实例

private TestStream() {

} // 私有无参构造方法

// 该类必须自行创建

// 有2种方式

private static TestStream ts1 = null;

// 这个类必须自动向整个系统提供这个实例对象

public static TestStream getTest() {

if (ts1 == null) {

ts1 = new TestStream();

}

return ts1;

}

public void getInfo() {

System.out.println("output message " + name);

}

public static void main(String[] args) {

TestStream s = TestStream.getTest();

s.setName("张孝祥 1");

System.out.println(s.getName());

TestStream s1 = TestStream.getTest();

s1.setName("张孝祥 2");

System.out.println(s1.getName());

s.getInfo();

s1.getInfo();

if (s == s1) {

System.out.println("创建的是同一个实例");

} else if (s != s1) {

System.out.println("创建的不是同一个实例");

} else {

System.out.println("application error");

}

}

}

////////////////////////////////////////////

在Java中,单例设计模式是什么意思?有什么优势?

单例模式:保证一个类在使用过程中,只有一个实例。

优势就是单例模式的作用,这个类永远只有一个实例。

还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收。

java的学习建议:

首先要看书读理论,不一定都懂,因为有一个懂的过程;

然后就是分析代码,看看书上的代码的意思,逐行逐行地看,去体会;

最重要的一点就是敲写代码,刚开始不会没关系,照着书一行一行的敲,然后运行,观察结果,把程序运行结果联系程序代码,学得多一点了就尝试修改代码,改一点点看运行结果有什么变化,便于理解程序内部执行的机制。

设计模式之单例模式

单例设计模式理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫单例模式。

下面的示例中如果每个类都创建一个 Logger 实例,就可能造成日志内容被覆盖的情况。

如果有些数据在系统中只应保存一份,那就比较适合设计为单例类。比如,配置信息类,全局 ID 生成器等。

要实现一个单例,我们要考虑以下几点:

懒汉式相对于饿汉式的优势是 「支持延迟加载」 。但缺点也很明显,因为使用了 synchronized 关键字导致这个方法的 「并发度很低」 。如果这个单例类偶尔会被用到,那这种实现方式还可以接受。但是,如果频繁地用到,就会导致性能瓶颈,这种实现方式就不可取了。

这是一种既支持延迟加载、又支持高并发的单例实现方式。

在 java1.5 以下 instance = new Singleton(); 有指令重排问题,需要给 instance 成员变量加上 volatile 关键字,java1.5 之后不会再这个问题。

这种方式利用了 Java 的静态内部类,有点类似饿汉式,但又能做到了延迟加载。

当外部类 Singleton 被加载的时候,并不会创建 SingletonHolder 实例对象。只有当调用 getInstance() 方法时,SingletonHolder 才会被加载,这个时候才会创建 instance。insance 的唯一性、创建过程的线程安全性,都由 JVM 来保证。所以,这种实现方法既保证了线程安全,又能做到延迟加载。

这是一种最简单的实现方式,基于枚举类型的单例实现。这种实现方式是通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。

上面的单例类对象是进程唯一的,一个进程只能有一个单例对象。那如何实现一个线程唯一的单例呢?

假设 IdGenerator 是一个线程唯一的单例类。在线程 A 内,我们可以创建一个单例对象 a。因为线程内唯一,在线程 A 内就不能再创建新的 IdGenerator 对象了,而线程间可以不唯一,所以,在另外一个线程 B 内,我们还可以重新创建一个新的单例对象 b。

我们通过一个 ConcurrentHashMap 来存储对象,其中 key 是线程 ID,value 是对象。这样我们就可以做到,不同的线程对应不同的对象,同一个线程只能对应一个对象。实际上,Java 语言本身提供了 ThreadLocal 工具类,可以更加轻松地实现线程唯一单例。

java中常用的设计模式有哪些?

您好:

java中的设计模式有23种,具体如下:

创建型

抽象工厂模式、工厂方法、建造者模式、原型模式、单态模式

结构型

适配器模式、桥接模式、组合模式、外观模式、装饰者模式、享元模式、代理模式、

行为型

责任链模式、命令模式、解释器模式、迭代模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式

常见的有七种,具体如下:单例模式、工厂模式、建造(Builder)模式、观察者模式、适配器(Adapter)模式、代理模式、装饰模式

举个例子:

通过调用getInstance()方法来创建实例。

其他不一一举例,仅供参考!希望对你有帮助

设计模式java单例的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java设计模式及应用案例、设计模式java单例的信息别忘了在本站进行查找喔。