在封装这里,最后讲一下,单例模式
/*
* 设计模式:解决某一类问题行之有效的解决办法(思想)。
* 单例(Singleton)设计模式:
* 学习设计模式必须先弄清楚他是解决什么问题的
* 单例是解决什么问题的呢?
* 可以保证一个类的对象的唯一性
*
* 场景:
* 比如多个程序都要使用一个配置文件中的数据,
* 而且要实现数据的共享和交换
* 必须要将多个数据封装到一个对象中
* 而且多个程序操作的是同一个对象
* 那也就是说必须保证这个配置文件对象的唯一性
*
* 怎么能保证对象的唯一性呢?(思路)
* 1.一个类只要提供了构造函数,就可以产生对象,
* 且产生的对象数量无法控制,完全无法保证对象的唯一性(只创建一个对象)
* 那么,既然对象数量不可控制,直接不让其他程序创建对象就可以了。
* 2.如果不让其他程序创建对象,那对象何在?
* 可以在自己的本类中创建一个对象。这样的好处是什么?可控。
* 3.对象创建完成后,是不是要给其他程序提供访问的方式?是的,要提供。
*
* 实现步骤:
* 1.怎么能不让其他程序创建对象呢?
* 直接私有化(private)构造函数,不让其他程序创建的对象初始化。
* 2.怎么在本类中创建一个对象呢?
* 直接在本类中new一个本类对象。
* 3.怎么给其他程序提供访问方式呢?
* 定义一个功能,其他程序可以通过这个功能,获取到本类的对象。
*
* */
//饿汉式
package day_06;
public class Singleton {
double x=0;
// 1. 私有化构造函数
private Singleton(){
}
// 2. 创建一个本类对象
private static /*final*/ Singleton st=new Singleton();
//静态只能访问静态,所以,如果getInstance这个静态方法要想反问st
//那么st这个变量必须也是静态的。
//st变量不对外提供,所以要进行私有,加private修饰
//final暂不解释
//个人小疑问:如果st可以直接定义成静态,
//那么在别的类中直接可以通过类名就可以调用了
//为什么 还要再通过在本类中创建返回值为st的方法来调用他。
/*上述问题的解答:★★★★★★
* 亲测,Singleton.st编译运行都没问题,也就是说Singleton.st可以创建对象
* 那么为什么还要使用getInstance方法来调用st呢?
* 加入方法来实现就是为了对对象可控。
* 所以,一般是通过类名调用方法来实现对象的创建,而不是通过类名调用变量来实现*/
// 3. 创建一个方法,返回这个对象
/*
* Singleton类的构造函数已经被私有化,所以其他类无法通过new创建其实例对象
* 但是,Singleton类已在其本类中创建了其实例对象st
* 所以可以调用st达到创建对象的目的
* Singleton已在本类中定义了返回值为st的方法getInstance
* 所以可以通过调用getInstance方法进而得到其返回值st,也就是Singleton的实例对象
* 但是通过对象调用getInstance方法已经不可能(因为其他类无法通过new创建对象)
* 所以,只能用类名调用,所以这个方法只能是静态方法(static)
*
* 如果getInstance这个方法在别的类中不能调用
* 那么Singleton这个类的其他内容都无法使用,
* 所以getInstance这个方法的权限要最大
* 即要使用public修饰符
* */
public static Singleton getInstance(){
return st;
}
void show(double x){
this.x=x;
System.out.println("----这里是测试码----");
System.out.println("----"+"x="+this.x+"----");
}
void show(){
System.out.println("x="+x);
}
}
public class SingletonDemo {
/**
*
@param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton st= Singleton.getInstance();
Singleton st1= Singleton.getInstance();
st.show(8);
st1.show();
}
}
//懒汉式
//单例延迟加载方式
/*单例的另一种体现
* 懒汉式与饿汉式的区别:
* 懒汉式只有当调用getInstance方法时才会创建对象
* 饿汉式当类加载就会创建对象
*
*
* 面试中遇到的更多的是懒汉式
* 实际开发用饿汉式比较多
* 这两者不牵扯内存问题
* 因为类的编写就是为了对象的创建,不创建对象的类没什么用
* 所以,两者都需要创建对象,都需要在堆中开辟空间
* 只是开辟的时间不同,所以两者都要占用内存*/
public class Singleton2 {
private int x;
private Singleton2(){
}
private static Singleton2 st2=null;
public static Singleton2 getInstance(){
if(st2==null){
st2=new Singleton2();
}
return st2;
}
void show(int x){
this.x=x;
System.out.print("x="+this.x);
}
}
public class SingletonDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton2 st2=Singleton2.getInstance();
st2.show(5);
}
}