单例设计模式

设计模式:将前人总结好的经验我们直接拿来使用

  • 一共有23种,常用的有单例设计模式,模板设计模式,工厂设计模式,装饰设计模式,适配器设计模式,代理设计模式.

  • 单例设计模式:一个类只允许有一个对象,建立一个全局的访问点,将它提供出去供大家使用.

  • 分析:

  1. 用户只允许有一个对象
  2. 单例类
  3. 全局的访问点:得到的唯一的对象就是全局访问点,那怎么做到全局?—static
  4. 提供出去?
  5. 供大家使用?—单例的功能,通过给单例类添加成员实现
  • 单例类的作用:
  1. 可以实现两个对象之间的传值
  2. 可以在全局范围内调用很多的功能.
  • 好处:可以让两个对象在完全没有关系的前提下,实现值的传递,降低了耦合性,提高了内聚性

  • 耦合性,内聚性在微观上说:描述的是类与类之间的关系
    我们应该尽量提高内聚性,减少耦合性,可以提高程序的健壮性,增加代码的可移植性,方便实现模块儿化编程

  • 如何做到低耦合高内聚?

  • 在处理类与类关系的时候,让类之间的关系越紧密耦合性越高,内聚性越低.反之,关系越松散耦合性越低,内聚性越高.

单例设计模式

//单例类
//饿汉式:在定义变量的同时完成赋值
class SingleInstance{
	//第二步:在单例类的内部创建当前类的对象,并私有化
	private static SingleInstance singleInstance = new SingleInstance();
	public int num;
	//第一步:将构造方法私有化
	private SingleInstance() {
		
	}
	
	//第三步:建立一个静态的公共的方法,将单例类提供出去
	public static SingleInstance getInstance() {
		return singleInstance;		
	}
	
	//功能区----一般创建的是非静态的成员实现功能
	//创建成员变量
	//创建成员方法
}

//单例类
//懒汉式:开始只是定义变量,什么时候使用,什么时候赋值
class SingleInstance2{
	//第二步:在单例类的内部创建当前类的对象,并私有化
	private static SingleInstance2 singleInstance = null;
	//第一步:将构造方法私有化
	private SingleInstance2() {
		
	}
	
	//第三步:建立一个静态的公共的方法,将单例类提供出去
	public static SingleInstance2 getInstance() {
		if(singleInstance == null) {//为了保证对象的唯一性
		SingleInstance2 singleInstance = new SingleInstance2();
		}
		
		return singleInstance;		
	}
	
	//功能区----一般创建的是非静态的成员实现功能
	//创建成员变量
	//创建成员方法
	int num;
}

//实例:有两个类A、B,要求将A中的值传到B类中

class A{
	int num1;
	
	//通过单例传值
	public void danLiTest1() {
		SingleInstance singleInstance = SingleInstance.getInstance();
		singleInstance.num = num1;
		
	}
}

class B{
	int num2;
	
	//通过传参实现传值
	public void chuancanTest(A a ) {
		num2 = a.num1;
	}
	public void danLiTest2() {
		SingleInstance singleInstance = SingleInstance.getInstance();
		 num2= singleInstance.num;
	}
}

public class Demo5 {
	public static void main(String[] args) {
//		SingleInstance singleInstance1 = new SingleInstance();
//		SingleInstance singleInstance2 = new SingleInstance();
//		System.out.println(singleInstance1 == singleInstance2);
		
		//使用单例类
		SingleInstance singleInstance1 = SingleInstance.getInstance();
		SingleInstance singleInstance2 = SingleInstance.getInstance();
		System.out.println(singleInstance1 == singleInstance2);
		
		//要求将A中的值传到B类中
		A a = new A();
		B b = new B();
		
		a.num1 = 4;
		
		//传值第一种方法:直接传值
		//不可取,一般成员变量都是私有的
		b.num2 = a.num1;
		
		//第二种方式:传参,让A类和B类之间产生了关系
		b.chuancanTest(a);
		
		//第三种方式:通过单例传值,让A类与B类之间是独立的
		a.danLiTest1();
		b.danLiTest2();
	}
}