设计模式之单例模式
程序员文章站
2022-06-28 17:51:12
1.单例(Singleton)模式的定义一个类只有一个实例,且该类能自行创建这个实例的一种模式2.单例模式特点单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点。3.单例模式的优缺点优点:单例模式可以保证内存里只有一个实例,减少了内存的开销。可以避免对资源的多重占用。单例模式设置全局访问点,可以优化和共享资源的访问。缺点:单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径......
1.单例(Singleton)模式的定义
一个类只有一个实例,且该类能自行创建这个实例的一种模式
2.单例模式特点
- 单例类只有一个实例对象;
- 该单例对象必须由单例类自行创建;
- 单例类对外提供一个访问该单例的全局访问点。
3.单例模式的优缺点
优点:
- 单例模式可以保证内存里只有一个实例,减少了内存的开销。
- 可以避免对资源的多重占用。
- 单例模式设置全局访问点,可以优化和共享资源的访问。
缺点:
- 单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径,违背开闭原则。
- 在并发测试中,单例模式不利于代码调试。在调试过程中,如果单例中的代码没有执行完,也不能模拟生成一个新的对象。
- 单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则。
4.懒汉单例模式应用
package singleton;
/**
* 懒汉单例模式:类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例
* @author Admin
*
*/
public class LazySingleton {
//保证 instance 在所有线程中同步
// volatile关键字修饰的共享变量主要有两个特点:1.保证了不同线程访问的内存可见性 2.禁止重排序
private static volatile LazySingleton instance=null;
//private 避免类在外部被实例化
private LazySingleton(){}
public static synchronized LazySingleton getInstance() {
//getInstance 方法前加同步
if(instance==null){
instance=new LazySingleton();
}
return instance;
}
}
package singleton;
/**
* 懒汉式单例模式案例
* @author Admin
*
*/
public class LazySingletonDemo {
public static void main(String[] args) {
// 调用getInstance方法
Country country1=Country.getInstance();
Country country2=Country.getInstance();
// 判断对象是否相同
if(country1==country2) {
System.out.println("是同一个对象");
}else {
System.out.println("不是同一对象");
}
}
}
//国家类
class Country{
//保证instance在所有线程中同步
private static volatile Country instance=null;
//private避免类在外部被实例化
private Country() {
System.out.println("出现一个国家!");
}
public static synchronized Country getInstance(){
//在getInstance方法上加同步
if(instance==null) {
instance=new Country();
}else {
System.out.println("已经有一个国家,不能产生新国家!");
}
return instance;
}
}
5.饿汉单例模式应用
package singleton;
/**
* 饿汉单例模式:类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了
* @author Admin
*
*/
public class HungrySingleton {
private static final HungrySingleton instance=new HungrySingleton();
private HungrySingleton(){
}
public static HungrySingleton getInstance(){
return instance;
}
}
package singleton;
/**
* 饿汉单例模式例子
* @author Admin
*
*/
public class HungrySingletonDemo {
public static void main(String[] args) {
Person p1=Person.getInstance();
Person p2=Person.getInstance();
if(p1==p2) {
System.out.println("同一个人");
}else {
System.out.println("不是同一个人");
}
}
}
//人类
class Person{
private static Person instance=new Person();
private Person() {
System.out.println("出现一个人");
}
public static Person getInstance() {
return instance;
}
}
本文地址:https://blog.csdn.net/weixin_44364444/article/details/109581790
上一篇: cdr怎么绘制立体的齿轮零件模型?