单例设计模式
设计模式:将前人总结好的经验我们直接拿来使用
-
一共有23种,常用的有单例设计模式,模板设计模式,工厂设计模式,装饰设计模式,适配器设计模式,代理设计模式.
-
单例设计模式:一个类只允许有一个对象,建立一个全局的访问点,将它提供出去供大家使用.
-
分析:
- 用户只允许有一个对象
- 单例类
- 全局的访问点:得到的唯一的对象就是全局访问点,那怎么做到全局?—static
- 提供出去?
- 供大家使用?—单例的功能,通过给单例类添加成员实现
- 单例类的作用:
- 可以实现两个对象之间的传值
- 可以在全局范围内调用很多的功能.
-
好处:可以让两个对象在完全没有关系的前提下,实现值的传递,降低了耦合性,提高了内聚性
-
耦合性,内聚性在微观上说:描述的是类与类之间的关系
我们应该尽量提高内聚性,减少耦合性,可以提高程序的健壮性,增加代码的可移植性,方便实现模块儿化编程 -
如何做到低耦合高内聚?
-
在处理类与类关系的时候,让类之间的关系越紧密耦合性越高,内聚性越低.反之,关系越松散耦合性越低,内聚性越高.
//单例类
//饿汉式:在定义变量的同时完成赋值
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();
}
}