day03--面向对象--设计模式之单例模式

package day03;

/*
 * 静态代码块:static {  },主要作用:初始化静态成员变量
 * 
 * 静态代码块:随着类的加载而执行的,只执行一次
 * 
 * 构造代码块:{ },优先于构造方法执行,主要是来初始化成员变量
 * 
 * 构造代码块:随着对象的创建而执行,每次创建对象而执行
 * 
 * static修饰符什么时候使用?
 * 1.在多个类之间共享成员变量时,需要将其改为static静态成员
 * 2.如果一个成员方法中没有访问本类的成员变量,则将其改为static静态成员方法
 * 
 * 注:
 * 在程序优化中,建议不要过多地使用static,因为它会长时间地保留在内存中(方法区的静态区)
 *
 *对象初始化过程:
 *   1.加载类的字节码文件到jvm的方法区中
 *   2.为静态成员变量在静态区开辟内存空间,并初始化默认值
 *   3.加载静态代码块,初始化静态成员变量
 *   4.在堆中开辟空间(根据成员变量的大小),并默认初始化成员变量
 *   5.加载构造代码块,显示初始化成员变量
 *   6.加载构造方法,显示初始化成员变量
 *   7.将堆内存空间的首地址赋给对象的引用
 */

public class Demo7 {
    private static int age;
    static {
        System.out.println("age-->" + age);

        // 初始化静态成员变量,在类加载时执行
        age = 18;
        System.out.println("age-->" + age);
    }
    {
        // 构造代码块,可以被看成是一个无参的构造方法
        age += 1;
        System.out.println("构造代码块--->age" + age);
    }

    public static void main(String[] args) {
        new Demo7();
        // System.out.println("--age-->" + age);

        new Demo7();
        new Demo7();
        new Demo7();
    }

    public Demo7() {
        age += 1;
        System.out.println("构造方法中: age-->" + age);
    }

}
package day03;

/*
 * 设计模式:23种,解决某一类问题的最有效方法
 * 
 * 单例模式:在程序运行期间,保证类对象只会创建一次
 * 
 * 实现过程:
 * 
 * 1.私有化构造方法
 * 
 * 2.提供本类的实例对象(饿汉式和懒汉式)
 * 
 * 3.向类的外部提供一个方法,获取类的对象
 */

class View {
    private static View view = new View();// 2.提供本类的对象

    private View() {
        // 1. 构造方法私有化,不能在类的外部通过new创建对象
    }

    // 3.向外部提供可访问的方法,并返回当前类的对象
    public static View getInstance() {// 静态成员不能访问非静态成员
        return view;
    }
}

class TextView {
    private static TextView tv;

    private String text;

    private TextView(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public static TextView getInstance(String text) {
        if (tv == null) {// 懒汉式
            tv = new TextView(text);
        }
        return tv;
    }
}

public class Demo9 {

    public static void main(String[] args) {
        View v1 = View.getInstance();
        View v2 = View.getInstance();

        System.out.println(v1 == v2);// 比较的是内存地址

        TextView tv1 = TextView.getInstance("张三");
        TextView tv2 = TextView.getInstance("李四");

        System.out.println(tv1 == tv2);
        System.out.println(tv2.getText());
    }

}
package day03;

class BreadMachine {
    private static BreadMachine bm = null;

    private int counter;// 默认为0

    public BreadMachine() {
    }

    // 单例模式,获取当前类的对象
    public static BreadMachine getInstance() {
        if (bm == null) {
            bm = new BreadMachine();// 创建对象
        }
        return bm;
    }

    public void create() {
        counter++;
        System.out.println(String.format("正在制作第%d个面包", counter));
    }
}

public class Demo10 {

    public static void main(String[] args) {

        BreadMachine bm = BreadMachine.getInstance();
        for (int i = 0; i < 10; i++) {
            bm.create();
        }
        BreadMachine bm2 = BreadMachine.getInstance();
        for (int i = 0; i < 10; i++) {
            bm2.create();
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值