0

0

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

高洛峰

高洛峰

发布时间:2016-12-15 14:35:27

|

1787人浏览过

|

来源于php中文网

原创

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

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

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

单例模式

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

立即学习Java免费学习笔记(深入)”;

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

   

ISite企业建站系统1.2.3
ISite企业建站系统1.2.3

ISite企业建站系统是为懂点网站建设和HTML技术的人员(例如企业建站人员)而开发的一套专门用于企业建站的开源免费程序。本系统采用了全新的栏目维护模式,内容添加过程中,前后台菜单是一样的,需要维护前台某个栏目的内容,只需要进后台相应栏目即可,一般的企业人员只需要查看简易的说明就可以上手维护网站内容。通过自由度极高的模板系统,可以适应大多数情况的界面需求,后台带有标签生成器,建站只需要构架好HTM

下载


懒汉模式:

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中文网!

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
第二十四期_PHP8编程
第二十四期_PHP8编程

共86课时 | 3.4万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 1.4万人学习

第二十三期_PHP编程
第二十三期_PHP编程

共93课时 | 6.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号