设计模式

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

单例模式(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) 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

你可能感兴趣的:(设计模式)