• 技术文章 >Java >java教程

    浅析Java设计模式编程中的单例模式和简单工厂模式

    高洛峰高洛峰2016-12-15 14:35:27原创754
    单例模式
    动机
    有时候只有一个类的实例是很重要的。比如,一个系统应该只有一个窗口管理实例。

    单例模式是最简单设计模式:类负责实例化自己,确保只有一个实例,并且提供一个访问这个实例的入口。

    目的
    1. 确保只有一个实例被创建。
    2. 提供访问这个实例的入口。

    单例模式

    使用final确保被创建一次,private的构造函数确保不被实例化。public的getInstance方法确保外部能够访问。下面是饿汉模式:

    public class Singleton {
      private static final Singleton instance = new Singleton();
       
      private Singleton() {}
       
      public static Singleton getInstance() {
        return instance;
      }
    }


    懒汉模式:

    public class SingletonDemo {
        private static volatile SingletonDemo instance = null;
       
        private SingletonDemo() {    }
       
        public static SingletonDemo getInstance() {
            if (instance == null) {
                synchronized (SingletonDemo .class){
                    if (instance == null) {
                        instance = new SingletonDemo ();
                    }
               }
            }
            return instance;
        }
    }


    适用场景和实例
    1. Logger类,防止每次打印log的使用都创建一个Logger实例。
    2. 控制类,一般整个系统都只有一个控制实例。

    具体问题和实现
    1. 线程安全,健壮的单例模式应该是线程安全的。
    2. 懒汉模式使用了双重锁机制。
    3. 饿汉模式使用静态变量,在程序加载时就实例化,保证了只有一个实例。
    4. 抽象工厂和工厂方法通常被设计成单例模式,以保证只有一个工厂。
    5. 使用序列化和反序列化时,会有多个实例被创建,使用readResolve函数避免这个情况,不过最好是不要使用序列化。

       public class Singleton implements Serializable {
    ...
      
    // This method is called immediately after an object of this class is deserialized.
    // This method returns the singleton instance.
    protected Object readResolve() {
      return getInstance();
    }
    }


    关键点
    1. 在多线程的程序中,要注意数据的同步。
    2. 序列化时要使用readResolve方法返回实例,避免多个对象被创建。
    3. 如果被多个类加载器加载时,会有多个实例被创建。


    简单工厂模式
    动机
    简单工厂模式是抽象工厂和工厂方法的基础和初步实现。

    目的
    1. 不向客户透露对象实例化的细节。
    2. 通过通用接口创建对象。

    实现

    简单工厂模式

    实现非常简单:
    1. Client需要Product时,不使用new来创建,而是提供 Product 描述给Factory,让 Factory 提供一个新的 Product 。
    2. Factory实例化一个Product给Client。
    3. Client使用抽象Product,而不关心Product的具体实现。

    实例
    1. 绘制形状的绘图程序。形状就是Product接口,三角形这些是Concrete Product,我们可以创建一个工厂,然后根据客户的描述创建对于的产品。不过添加新的形状时,我们需要修改工厂类。

    具体问题和实现
    1. 添加新产品时,需要修改工厂。

    public class ProductFactory{
      public Product createProduct(String ProductID){
        if (id==ID1)
          return new OneProduct();
        if (id==ID2) 
          return new AnotherProduct();
        ... // so on for the other Ids
          
        return null; //if the id doesn't have any of the expected values
      }
      ...
    }

    一般我们通过if语句判断产品描述,并实例化不同的产品,有新的产品时,我们需要增加新的判断。通过抽象工厂模式可以解决这个问题。

    总结
    1. 当你确实需要工厂模式时才使用,不然只是增加程序的复杂度,比如多种对象有相似的基本类型时,可以考虑使用简单工厂模式来统一创建对象。
    2. 简单工厂有比较多的判断分支语句,违反了开闭原则的对修改关闭的原则,所以,明智的做法是,对一些固定和简单程序使用简单工厂模式,对一些复杂和需要经常扩展的程序,使用抽象工厂模式或者工厂方法模式。


    更多浅析Java设计模式编程中的单例模式和简单工厂模式相关文章请关注PHP中文网!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:java 三种工厂模式的快速,简易理解 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Java数据结构之单链表与OJ题• 详细介绍Java正则表达式之单字符匹配和预定义字符• Java总结分享之反射、枚举、Lambda表达式• 一起来分析java设计模式之单例• 一文搞懂Java线程池实现原理
    1/1

    PHP中文网