java设计模式之——单例模式(创建性)

1、设计模式遵守原则

a、开闭原则(Open Close Principle)

  对扩展开放,对修改关闭。

2、里氏代换原则(Liskov Substitution Principle)

  只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

3、依赖倒转原则(Dependence Inversion Principle)

  这个是开闭原则的基础,对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

  使用多个隔离的接口来降低耦合度。

5、迪米特法则(最少知道原则)(Demeter Principle)

  一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)

  原则是尽量使用合成/聚合的方式,而不是使用继承。继承实际上破坏了类的封装性,超类的方法可能会被子类修改。

 

2、顾名思义,单例是指工程中只出现一次实例。单例模式的最大作用是,限制程序中出现过多冗余的实例,常见的应用场景有工程配置文件加载、多线程数据库连接池、操作系统的文件系统等;

3、单线程时单例模式设计:

      经典的a、恶汉模式b、饱汉模式

      a、恶汉模式【静态常量】,工程加载时虚拟机会自动实例化实例。无需担心线程安全问题,但是无法判断是否用到对应实例,任然存             在资源让费风险。

      class SingletonInstance{

                private SingletonInstance(){};

                private static SingletonInstance singletonInstance = new SingletonInstance();

                public SingletonInstance getInstance(){

                           return sinletonInstance;     

                 }

         }  

       b、懒汉模式,调用的时候创建对应的实例,实现单例模式,但是在多线程时存在线程安全问题。

        class SingletonInstance{

                  private SingletonInstance(){};

                  private static SingletonInstance singletonInstance = null;

                  public static SingletonInstance getInstance(){

                            if(singletonInstance == null){

                                    singletonInstance  = new SingletonInstance(); 

                            }

                            return singletonInstance;

                  }

          }

4、多线程情况下,设计单例模式:

          a、懒汉模式,进行加锁操作(并没有实现同步)

               public class SingletonInstance {

                         private SingletonInstance(){};
                                    private static SingletonInstance singletonInstace = null;
                                    public static SingletonInstance getInstance(){
                                                synchronized(SingletonInstance.class){
                                                        if(singletonInstace ==null){
                                                                   singletonInstace = new SingletonInstance();
                                                         }
                                                   }
                                                  return singletonInstace;
                                                 }
                                }

              b、懒汉模式,同步代码块(效率比较低)

                    class SingletonInstance{

                                private SingletonInstance(){};

                                private static SingletonInstance singletonInstance = null;

                                public static synchronized SingletonInstance getInstance(){

                                             if(singletonInstance == null){

                                                          singletonInstance  = new SingletonInstance(); 

                                               }

                                              return singletonInstance;

                                   }

                         }

                   c、懒汉模式,双重加锁实现多线程同步,采用volatile关键字。

                    class SingletonInstance{

                                private SingletonInstance(){};

                                private static volatile SingletonInstance singletonInstance = null;

                                public static SingletonInstance getInstance(){

                                             if(singletonInstance == null){

                                                      synchronized (SingletonInstance.class){

                                                              if(singletonInstance == null){

                                                                      singletonInstance  = new SingletonInstance(); 

                                                               }

                                                       }                                                       

                                               }

                                              return singletonInstance;

                                   }

                         }

                    d、静态内部类,实现单例模式。

                         class SingletonInstance{

                                 private SingletonInstance(){};

                                 private static class Instance{

                                          private static final SingletonInstance SI = new SingletonInstance();

                                 }

                                  public SingletonInstance getSingletonInstance(){

                                             return Instance.SI;

                                  }

                         }  

                      e、通过枚举类实现单例模式【其实和静态内部类实现单例模式类似】【建议采用】。

                        class SingletonInstance{....};

                        public enum GetSingletonInstance{

                                   INSTANCE;

                                   private SingletonInstance singletonInstance = null;

                                   private GetSingletonInstance{

                                              singletonInstance = new SingletonInstance();

                                   }

                                   public SingletonInstance getSingletonInstance(){

                                                return singletonInstance;

                                   }

                        }

                          调用的时候采用 GetSingletonInstance.INSTANCE.getSingletonInstance()获取SingletonInstance类的单例。

     5、注释

                   a、java中volatile关键字。

                           首先,了解共享变量的概念。

                           i=i+1; 

                这条程序的执行过程,由一条线程向主内存复制一份i变量值到计算机高速缓存中,cpu指令执行,写入计算机高速缓存,最后将计算机高速缓存值刷新会计算机主内存。

     当多核cpu对这条代码操作多次时,每条线程都有自己的高速缓存区,因此会出现缓存不一致性问题。

               也就是说,如果一个变量在多个CPU中都存在缓存(一般在多线程编程时才会出现),那么就可能存在缓存不 一致的问题。解决方案,总线加锁、缓存一致性协议【硬件层面】。

                并发编程中必须保证的三个原则,原子性、可见性、有序性。java中通过synchronized【锁】来实现多线程情况下的原子性。通过volatile关键字保证共享变量的可见性,同时也可以通过锁机制实现变量的可见性,当进程执行出锁时会将高速缓存中变量值刷会主内存。java中的有序性可以通过synchronized和volatile关键字实现,java语言的happens-before机制也保证了程序执行的有序性【现行发生原则】。现行发生原则包括,程序次序规则、锁定规则、volatile变量规则、传递规 则、线程启动规则、线程中断规则、线程终止规则、对象销 毁规则。

                    b、java 中枚举类实现方式【jdk1.5以上】

                          enum Instance{

                                   INSTANCETYPE1,INSTANCETYPE2,INSTANCETYPE3;

                           }

                           类似于

                            Instance extends enum{

                                     private static final INSTANCETYPE1;     //相当于—— new Instance()

                                     private static final INSTANCETYPE2;     //相当于—— new Instance()

                                     private static final INSTANCETYPE3;     //相当于—— new Instance()

                              }

                   这里INSTANCETYPE1、INSTANCETYPE2、INSTANCETYPE3都是类Instance的实例,由于枚举类规定其构造方法必须为私有的,因此实例化过程由其自身实现。

                           可以在枚举类中定义私有构造函数,普通方法,抽象方法。

                         enum Instance {
    
                                 InstanceType1(1,"Type1"){
                                        public String normalMethod(String Type){
                                                   return "Type1重写的普通方法"+Type;
                                         }
                                        @Override
                                        public String abstractMethod(String Type) {
                                                      // TODO Auto-generated method stub
                                                      return InstanceType1.propertity1+InstanceType1.propertity2+"Type1重写的抽象方法"+Type;
                                         }
        
                                    },
                                    InstanceType2(2,"Type2"){
                                            @Override
                                            public String abstractMethod(String Type) {
                                                     // TODO Auto-generated method stub
                                                     return InstanceType2.propertity1+InstanceType2.propertity2+"Type2重写的抽象方法"+Type;
                                            }
        
                                        };
    
                                        private Integer propertity1;
                                        private String propertity2;
    
                                        Instance(Integer propertity1,String propertity2){
                                               this.propertity1 = propertity1;
                                               this.propertity2 = propertity2;
                                        }
    
                                        public String normalMethod(String Type){
                                               return Type+"这是普通方法";
                                        }
    
                                        public abstract String abstractMethod(String Type);
                                  }

6、实例【读取配置文件】

import java.io.InputStream;
           import java.util.Properties;

enum TestForSingletonInstance {
                   INSTANCE;
                   private PorpertityLoad porpertityLoad=null;
                  TestForSingletonInstance(){
                         if(porpertityLoad == null)
                                  porpertityLoad = new PorpertityLoad();
                           }
                          public PorpertityLoad getSinletonInstance(){
                                    return porpertityLoad;
                         }
                    }

            class PorpertityLoad{
                       public Properties properties = null;
                       PorpertityLoad (){
                                 try {
                                        properties = new Properties();
                                        InputStream in = TestForSingletonInstance. class.getClassLoader().

                                                                     getResourceAsStream("properties/singletonInstanceTest.properties");
                                        properties.load(in);
                                 } catch (Exception e) {
                                          // TODO: handle exception
                                 }
                      }
             }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值