设计模式之简单的单例模式

第一个需求:在整个程序运行过程中,要求有且仅有一个这个类的类队象存在

解决一:在这个程序运行过程中,有且只调用一次构造方法。

问题一:方案一不够严谨,存在一个问题就是就我自己知道只能调用一次构造方法,但是别人不知道,别人都可以通过new关键字创建这个类的对象

解决二:我们可以不让类外调用这个构造方法,通过private对构造方法进行私有化。

private SingleDemo(int num) {
this.num = num;
}

问题二:私有化构造方法之后,在类外不能使用,但是我还想用这个类,怎么能够在类外创建对象或者是获取对象呢?

目前环境:一,构造方法不能用。二,类外没有对象。

解决二:现在能够使用的只能是静态方法,

借助于静态(static)获取或者创建类对象。

该方法要提供给类外使用:权限修饰符为【public】

  调用时不能通过对象来调用,需要类名对象,使用【static】修饰
  该方法是要获取当前类的类对象,所以 返回值应该是当前类对象类型  【SingleDemo】
  方法名字:【getInstance()】

  参数要和类内私有化的构造方法所需参数一致:【int num】

public static SingleDemo getInstance(int num) {

SingleDemo s = new SingleDemo(num);

//私有化的构造方法可以在类内使用

return s;
}


第二个需求:

  如果能判断一下当前的程序当中有没有SingleDemo的类对象,
  如果没有,创建,调用私有化的构造方法
  如果有,不再创建
  public static SingleDemo getInstance(int num) {

if (s == null) {
s = new SingleDemo(num);
}
//私有化的构造方法可以在类内使用
return s;
}

  需要一个变量来保存创建对象的地址

        public static SingleDemo s = null;

  变量数据类型 SingleDemo 
  放哪?
  假设:
  1. 用局部变量保存对象地址
  不行!!!每一次调用时,之前的局部已经被销毁
  2. 用非静态成员变量
不用想,静态方法中不能使用非静态的成员变量!!!
3. 用静态成员变量
解决:

用静态的成员变量来保存之前创建的对象地址

public static SingleDemo s = null;

问题:
发现类外可以直接通过类名来修改静态成员变量的数据
解决:

private修饰

        private static SingleDemo s = null;

下面是代码:

class SingleDemo {
int num;

private static SingleDemo s = null;

private SingleDemo(int num) {
this.num = num;
}

public void test() {
System.out.println(this.getClass() + "的test方法");
}

public static SingleDemo getInstance(int num) {

if (s == null) {
s = new SingleDemo(num);
}
//私有化的构造方法可以在类内使用
return s;
}
}


public class Demo1 {
public static void main(String[] args) {
//
// SingleDemo s = new SingleDemo(5);
SingleDemo s1 = SingleDemo.getInstance(5);
System.out.println(s1);

SingleDemo s2 = SingleDemo.getInstance(5);
System.out.println(s2);

// SingleDemo.s = null;

SingleDemo s3 = SingleDemo.getInstance(5);
System.out.println(s3);
SingleDemo s4 = SingleDemo.getInstance(5);
System.out.println(s4);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值