当前位置: 移动技术网 > IT编程>开发语言>Java > 浅析Java设计模式编程中的单例模式和简单工厂模式

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

单例模式
动机
有时候只有一个类的实例是很重要的。比如,一个系统应该只有一个窗口管理实例。

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

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

201612984418871.gif (262×198)

使用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. 通过通用接口创建对象。

实现

201612984525086.gif (379×281)

实现非常简单:
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. 简单工厂有比较多的判断分支语句,违反了开闭原则的对修改关闭的原则,所以,明智的做法是,对一些固定和简单程序使用简单工厂模式,对一些复杂和需要经常扩展的程序,使用抽象工厂模式或者工厂方法模式。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网