美文网首页
设计模式

设计模式

作者: 予早 | 来源:发表于2017-04-07 17:16 被阅读0次

    史上最全设计模式导学目录(完整版)

    单例模式(Singleton Pattern)

    确保对象的唯一性——单例模式

    0. 定义

    (1) 系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。
    (2) 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。

    确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。

    1. 使用场景:
    为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例。

    2. 举个例子

    class TaskManager  
    {  
         private static TaskManager tm = null; //静态对象,作为外部共享的唯一实例。
         private TaskManager() {……} //初始化窗口,private防止外部实例化
         public void  displayProcesses() {……} //显示进程  
         public void  displayServices() {……} //显示服务  
         public static TaskManager getInstance()  
         {  
            if (tm == null)  
            {  
                tm = new TaskManager();  
            }  
            return tm;  
        }  
       ……  
    }  
    

    3. 多线程导致单例模式失效解决方法

    1. 饿汉式单例类
    class EagerSingleton {   
        private static final EagerSingleton instance = new EagerSingleton();   
        private EagerSingleton() { }   
      
        public static EagerSingleton getInstance() {  
            return instance;   
        }     
    }  
    

    在类被加载时就将自己实例化,无须考虑多线程访问问题,可以确保实例的唯一性,但系统加载时间可能会比较长

    1. 懒汉式单例类
    class LazySingleton {   
       private volatile static LazySingleton instance = null;   
     
       private LazySingleton() { }   
     
       public static LazySingleton getInstance() {   
           //第一重判断  
           if (instance == null) {  
               //锁定代码块  
               synchronized (LazySingleton.class) {  
                   //第二重判断  
                   if (instance == null) {  
                       instance = new LazySingleton(); //创建单例实例  
                   }  
               }  
           }  
           return instance;   
       }  
    }  
    

    实现了延迟加载,需要通过双重检查锁定等机制进行控制,这将导致系统性能受到一定影响。

    1. IoDH

    通过使用IoDH,我们既可以实现延迟加载,又可以保证线程安全,不影响系统性能,不失为一种最好的Java语言单例模式实现方式(其缺点是与编程语言本身的特性相关,很多面向对象语言不支持IoDH)。

    //Initialization on Demand Holder  
    class Singleton {  
        private Singleton() {  
        }  
          
        private static class HolderClass {  
                private final static Singleton instance = new Singleton();  
        }  
          
        public static Singleton getInstance() {  
            return HolderClass.instance;  
        }  
          
        public static void main(String args[]) {  
            Singleton s1, s2;   
                s1 = Singleton.getInstance();  
            s2 = Singleton.getInstance();  
            System.out.println(s1==s2);  
        }  
    }  
    

    简单工程模式(Simple Factory Pattern)

    工厂三兄弟之简单工厂模式

    1. 定义:
      定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。

    2. 使用场景:
      (1) 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
      (2) 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

    相关文章

      网友评论

          本文标题:设计模式

          本文链接:https://www.haomeiwen.com/subject/caihattx.html