设计模式是一种设计思想,解决方案,经验总结。

java的设计模式大体上分为三大类:

  • 创建型模式(5种): 用于解决结局对象创建
  • 单例模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式。
  • 结构型模式(7种):把类和对象结合在一起,构成复杂结构
  • 适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
  • 行为型模式(11种): 解决类或对象之间的交互,优化类或者对象之间的关系
  • 观察者模式、策略模式、模板方法模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

 

1. 单例模式(Singleton)

如果一个类中只有方法会被大量使用,没必要每次都创建一个新实例,只创建一个实例,每次都调用这个实例的方法就可以 

 让一个类只创建一个对象。

package xiushifu.singleton;

//如果一个类中只有方法会被大量使用,没必要每次都创建一个新实例,只创建一个实例,每次都调用这个实例的方法就可以 
//让一个类只创建一个对象。
//在内部创建一个实例,构造器全部设置为private,所有方法均在该实例上改动,在创建上要注意类的实例化只能执行一次,可以采用许多种方法来实现,如Synchronized关键字,或者利用内部类等机制来实现。

//1.让构造方法变成私有
//2.通过static控制创建
public class SingleTon {

    private SingleTon(){}//将构造方法变为私有,不能通过外部随意创建

    //饿汉式
    private static SingleTon singleton = new SingleTon();  //static 表示所有实例的这个变量都被存在一个空间内,每次修改都会覆盖掉之前的值,保证了实例只有一个。

    public static SingleTon newInstance(){ //可以通过class直接调用。

        return singleton;   //因为属性也是私有的,所以需要一个公有方法来获取。
    }

    //懒汉式   使用这种则不能直接在class里直接用this.singleton了,否则会空指针。
//    private static SingleTon singleton;  //static 表示所有实例的这个变量都被存在一个空间内,每次修改都会覆盖掉之前的值,保证了实例只有一个,不直接创建实例,需要时再创建。
//
//    public static SingleTon newInstance(){ //可以通过class直接调用。
//        if(singleton == null){  //判断之前是否被调用过,如果是第一次则创建实例
//            singleton = new SingleTon();
//        }
//        return singleton;   //因为属性也是私有的,所以需要一个公有方法来获取。
//    }


    public static void main(String[] args) {
//        SingleTon.singleton就是一个初始化完毕的实例,它是属于类的,这样保证了只有一个。
        SingleTon s1 = SingleTon.singleton;//因为属性是private,所以这种写法只能在本类中使用
        SingleTon s2 = SingleTon.singleton;
        System.out.println(s1 == s2);//判断s1和s2的内存地址hashcode值是否一致。   返回一个16进制数字
        System.out.println(s1.equals(s2));//底层代码其实和s1==s2一样

        SingleTon s3 = SingleTon.newInstance();//可以在外部类中使用,和上面效果一样
        SingleTon s4 = SingleTon.newInstance();
        System.out.println(s3 == s4);
        System.out.println(s1 == s3);
    }
}

共有方法返回单例对象:

饿汉式:立即加载   启动项目就已经加载了,所以可能会浪费空间,不会产生空指针。  上面的是饿汉式

懒汉式:延迟加载   用到了才会加载,可能会异常,用到了才会加载(在public方法中new)不会浪费空间。   

生命周期托管:其他对象处理

02-13 10:07