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

作者:lixiang0522 时间:2021-10-13 15:27:54 

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

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

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

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

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

实现

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

实现非常简单:
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,设计模式
0
投稿

猜你喜欢

  • IDEA java出现无效的源发行版14解决方案

    2021-06-25 08:50:33
  • SpringBoot+JSON+AJAX+ECharts+Fiddler实现前后端分离开发可视化

    2021-11-12 14:49:17
  • Java创建线程池为什么一定要用ThreadPoolExecutor

    2023-04-22 06:03:31
  • java获取网络图片上传到OSS的方法

    2023-10-14 23:01:07
  • 浅谈maven的jar包和war包区别 以及打包方法

    2022-07-20 20:14:44
  • Java程序常见异常及处理汇总

    2021-08-12 04:20:44
  • Spring JDBCTemplate原理及使用实例

    2023-03-11 09:47:19
  • 深入剖析构建JSON字符串的三种方式(推荐)

    2023-09-26 07:47:22
  • Spring源码解析之BeanPostProcessor知识总结

    2022-04-07 22:13:34
  • android中使用SharedPreferences进行数据存储的操作方法

    2023-06-16 17:37:42
  • SpringBoot如何访问html和js等静态资源配置

    2023-08-17 08:07:43
  • Java StringUtils字符串分割转数组的实现

    2023-07-19 12:43:37
  • Mybatis日志模块的适配器模式详解

    2023-11-26 12:45:32
  • 浅谈MyBatis3 DynamicSql风格语法使用指南

    2023-11-25 13:05:06
  • IntelliJ IDEA中查看当前类的所有继承关系图

    2023-08-06 12:40:19
  • Unity使用鼠标旋转物体效果

    2021-10-17 05:08:12
  • Java集合框架之List ArrayList LinkedList使用详解刨析

    2022-04-24 13:43:43
  • Java并发编程之线程创建介绍

    2021-11-14 13:55:40
  • 带你详细了解Java值传递和引用传递

    2023-02-19 08:42:26
  • 使用Java实现简单串口通信

    2022-07-27 14:48:52
  • asp之家 软件编程 m.aspxhome.com