黑马程序员_Java基础[11]_单列设计模式

本文详细介绍了单例设计模式的概念及其实现步骤,并通过饿汉式和懒汉式的对比,展示了如何确保一个类只有一个实例,并提供了全局访问点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------- android培训 java培训 、期待与您交流! ----------

【扩编知识】
设计模式  JOF  解决某一类问题最行之有效的方法。
java中,有23种设计模式

学习其中一个:
单例设计模式】:

解决一个类在内存中只存在一个对象。
    (只能new出一个程序。)
想要保证对象唯一
1,为了避免其他程序过多建立该类对象,先禁止其他程序建立该对象。
2,还为了其他程序可以访问到该类对象,只好在本类中自定义一个对象。
3,为了方便其他程序对自定义对象的访问,可以提供一些访问方式。


那么这三步如何用代码体现?
1,构造函数私有化。     
2,在类中,创建一个本类对象。
3,提供一个方法,可以获取到该对象。


    执行步奏:
    1,执行main方法后, 内存中立刻生成【栈】,【堆】,【方法区】
    2,在【栈】中生成了ss
    3,在【方法区】中,加载出静态属性和方法:static s和 static getInstance()方法。
    4,在【堆】中生成对象:new Single();给出一个地址值:假设为0x001指向【方法区】中s的值
    5,当使用static getInstance()时,return s就是返回出s的值,即地址值,
    6,所以ss=s=s的地址值。
    7,假设再次new出一个ss2,  同理,也会指向这个地址值。


【例子】单例设计模式:常用饿汉式

 * 设计模式 ,java中有23中


    
    对应两种写法
    a,称为饿汉式  是先初始化对象  开发一般用该方法。
    b,为懒汉式    对象是方法被调用时,才初始化,也叫做对象的延时加载。
    两种方法都差不多。
    相比较,懒汉式没那么安全。
    【定义单列,建议使用饿汉式】
    
    不同处,懒汉式加载的时候,方法区的该类下的对象名,是null,而饿汉式 对象名指向的是地址,是已经有了一个对象。
 */
package DayXuexi;


class Single{
    /*[a]Single2  为另一种写法  
    称为饿汉式  是先初始化对象
    */
    private Single(){}//把私有修饰符去掉则可以new对象。
    static Single s=new Single();
    public static Single getInstance(){
        return s;        
    }

    //OK 唯一化已经搞定,现在我们来实验一下:
    private int num;
    
    public void setNum(int num){//写
        this.num=num;
    }
    public int getNum(){//读
        return num;
    }
    
    
}
class Single2{
    /*[b]Single 为另一种写法
     * Single 类进内存,对象还没有存在,只有调用了getInstance方法时才建立对象。
    */
    private Single2(){}
    private static Single2 s2=null;
    public static Single2 getInstance(){
        //为了避免一些情况 该方法最好添加一个锁 synchronized 同步同时该方法的效率就变低了。。(多线程知识点)
    //public static synchronized Single2 getInstance(){//这样写效率很低,还是注释掉。
        //为了更安全,更效率 把代码更改为:
        //if(s2==null){
        //    s2=new Single2();
        //}
        if(s2==null){
            synchronized(Single.class){
                if(s2==null){
                    s2=new Single2();//虽然效率高了,但是代码量又变多了,所以综合后,还是饿汉式常用。
                }
            }
        }
        return s2;
    } 
}



public class Dome_SheJiMoShi {
    
    public static void main(String []args){
        
        //new Single();
        //Single ss=new Single(); 这样是无法new的
        
        //Single.getInstance();//得这样:
        Single ss=Single.getInstance();//[1]
        //System.out.println(Single.getInstance());
        System.out.println(ss);
        
        //实验代码:
        
        Single s1=Single.getInstance();
        Single s2=Single.getInstance();
        s1.setNum(30);
        //s2值会是几? 如果s1s2都是new出来的又是几呢?
        System.out.println(s2.getNum());
    }

}




---------- android培训、 java培训 、期待与您交流!----------
黑马官网: http://edu.youkuaiyun.com/heima
### 黑马程序员 Java 课程资料及相关信息 #### 关于黑马程序员 Java 课程的内容 根据已知的信息,黑马程序员提供了全面的 Java 基础和进阶教程,涵盖了从零基础到高级开发者的多个阶段的学习内容。这些课程不仅适合初学者入门,还能够帮助有一定经验的开发者深入理解 Java 的核心概念和技术应用。 以下是关于该课程的一些具体模块描述: - **Java 基础入门** 这部分内容主要面向零基础学员,讲解了 Java 编程的基础语法、流程控制语句以及常见编程工具(如 IntelliJ IDEA)的使用技巧[^1]。例如,在 Mac 上使用 IntelliJ IDEA 自动生成 `get` 和 `set` 方法可以通过快捷键完成操作。 - **Java 高级特性与集合框架** 在进阶部分,课程重点介绍了 Java 中的集合框架及其应用场景。其中包括单列集合(继承自 `Collection` 接口)和双列集合(基于 `Map` 实现),并详细说明了它们的区别及适用场景[^3]。此外,还包括了如何利用集合存储复杂对象(如学生管理系统的实体类)并通过迭代器或其他方式对其进行遍历。 - **跨平台支持与 JVM 工作原理** 另外值得一提的是,Java 应用程序具有良好的跨平台兼容性。这是因为无论是在 Windows、Mac OS 或 Linux 系统下运行 Java 程序时,只需确保目标环境中已经安装有对应版本的 Java 虚拟机 (JVM),即可顺利完成编译执行过程而无需额外修改源码文件本身[^2]。 #### 如何获取相关资源? 对于希望下载或进一步了解上述提到的所有教学视频及其他配套材料的朋友来说,建议采取如下几种途径之一来获得合法授权后的完整版课件: 1. 访问官方授权合作网站或者教育机构主页查询最新发布的免费试听章节链接; 2. 加入由其他同学组建的学习交流群组分享心得体验的同时也可能有机会接触到更多优质补充文档; 3. 如果条件允许的话还可以考虑购买正版教材作为辅助参考资料以便更好地巩固所学知识点。 请注意尊重知识产权的重要性,在未经授权的情况下擅自传播受版权保护的作品可能会带来法律风险。 ```java // 示例代码展示:定义一个简单的Student类,并为其生成getter和setter方法 public class Student { private String name; private int age; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值