惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
C
Check Point Blog
Stack Overflow Blog
Stack Overflow Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
M
MIT News - Artificial intelligence
L
LangChain Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - Franky
WordPress大学
WordPress大学
博客园_首页
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Visual Studio Blog
L
LINUX DO - 最新话题
S
Security @ Cisco Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Help Net Security
Help Net Security
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
The GitHub Blog
The GitHub Blog
Schneier on Security
Schneier on Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
Jina AI
Jina AI
雷峰网
雷峰网
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
人人都是产品经理
人人都是产品经理
Microsoft Security Blog
Microsoft Security Blog
V
V2EX
N
News and Events Feed by Topic
V2EX - 技术
V2EX - 技术
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
O
OpenAI News
P
Proofpoint News Feed
H
Help Net Security
S
Securelist
Vercel News
Vercel News
Hacker News: Ask HN
Hacker News: Ask HN
博客园 - 三生石上(FineUI控件)

博客园 - 可可果

Java Annotation手册 .NET环境下五种邮件发送解决方案(转载) C#中的事务处理 - 可可果 - 博客园 用commons-fileupload-1.2 实现文件上传(适用于Trubine框架) 用JAVA实现文本形式的树状结构显示(转) Google十大搜索技巧 Javascript导出Excel的方法 - 可可果 - 博客园 理解session机制 session的工作原理(转载) Session监听 button添加链接的方法 - 可可果 - 博客园 获得select控件的文本值的方法 - 可可果 - 博客园 清除缓存的方法 - 可可果 - 博客园 Java中Excel导出时文件名乱码问题的解决 单例模式陷阱(转载) 解决用户意外退出在线列表无法及时更新问题(转载) Java开发中,试用hibernate建立关联时出现:not-null property references a null or transient value异常的原因 ListBox之间进行传值的脚本的例子,一般在添加权限,行业或者多项时可以用到 - 可可果 - 博客园 Velocity基本语法
java模式中的单例模式(转载) - 可可果 - 博客园
可可果 · 2007-12-06 · via 博客园 - 可可果

  1 单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
  2  特点:
  3        1,一个类只能有一个实例
  4        2,自己创建这个实例
  5        3,整个系统都要使用这个实例
  6     例: 在下面的对象图中,有一个"单例对象",而"客户甲""客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
  7 
  8     Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。一些资源管理器常常设计成单例模式。
  9     外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中管理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来管理这些属性文件。
 10 
 11 一个例子:Windows 回收站。
 12 在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。
 13 
 14 两种形式:
 15 1,饿汉式单例类
 16 public class Singleton {
 17 
 18   private Singleton(){}
 19 
 20   //在自己内部定义自己一个实例,是不是很奇怪?
 21   //注意这是private 只供内部调用
 22 
 23   private static Singleton instance = new Singleton();
 24 
 25   //这里提供了一个供外部访问本class的静态方法,可以直接访问  
 26   public static Singleton getInstance() {
 27     return instance;   
 28    }
 29 }
 30 
 31 2,懒汉式单例类
 32 
 33 public class Singleton {
 34 
 35   private static Singleton instance = null;
 36 
 37   public static synchronized Singleton getInstance() {
 38 
 39   //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次   
 40 
 41  
 42   //使用时生成实例,提高了效率!
 43   if (instance==null)
 44     instance=new Singleton();
 45   return instance;   }
 46 
 47 }
 48 
 49 
 50 第二中形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。
 51 
 52 
 53 注意到lazy initialization形式中的synchronized,这个synchronized很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。
 54 一般来说第一种比较安全。
 55 
 56  用单例模式实现的java连接MySql数据库
 57 
 58 package com.adrop.util;
 59 
 60 
 61 
 62 import java.sql.*;
 63 
 64 
 65 
 66 public class DBManager {
 67 
 68 //用户名
 69 
 70 private String user = "";
 71 
 72 //密码
 73 
 74 private String password = "";
 75 
 76 //主机
 77 
 78 private String host = "";
 79 
 80 //数据库名字
 81 
 82 private String database = "";
 83 
 84 //private DBManager dbm=null;
 85 
 86 
 87 
 88 /*
 89 
 90 private String url="jdbc:mysql://"+host+"/"+"useUnicode=true&characterEncoding=GB2312";
 91 
 92 */
 93 
 94 private String url ="";
 95 
 96 private Connection con = null;
 97 
 98 
 99 
100 Statement stmt;
101 
102 /**
103 
104 * 私有的构造方法,保证外部不能实例化,只能由DBManager自己能提供自
105 
106 * 己的实例,并且只能有一个。
107 
108 * 根据主机、数据库名称、数据库用户名、数据库用户密码取得连接。
109 
110 * @param host String
111 
112 * @param database String
113 
114 * @param user String
115 
116 * @param password String
117 
118 */
119 
120 private DBManager(String host, String database, String user, String password) {
121 
122 
123 
124 this.host = host;
125 
126 this.database = database;
127 
128 this.user = user;
129 
130 this.password = password;
131 
132 //显示中文
133 
134 this.url = "jdbc:mysql://" + host + "/" + database +
135 
136 "?useUnicode=true&characterEncoding=GB2312";
137 
138 
139 
140 try {
141 
142 Class.forName("org.gjt.mm.mysql.Driver");
143 
144 }
145 
146 catch (ClassNotFoundException e) {
147 
148 System.err.println("class not found:" + e.getMessage());
149 
150 }
151 
152 
153 
154 try {
155 
156 con = DriverManager.getConnection(this.url, this.user, this.password);
157 
158 //连接类型为ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY
159 
160 stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
161 
162 ResultSet.CONCUR_READ_ONLY);
163 
164 }
165 
166 catch (SQLException a) {
167 
168 System.err.println("sql exception:" + a.getMessage());
169 
170 }
171 
172 }
173 
174 /**
175 
176 * 静态工厂方法,来获得一个DBManager实例
177 
178 */
179 
180 public static DBManager getInstance(String host, String database, String user, String password){
181 
182 if(dbm==null){
183 
184 dbm=new DBManager(host,database,user,password);
185 
186 }
187 
188 return dbm;
189 
190 }
191 
192 /**
193 
194 * 返回取得的连接
195 
196 */
197 
198 public Connection getCon() {
199 
200 return con;
201 
202 }
203 
204 /**
205 
206 * 执行一条简单的查询语句
207 
208 * 返回取得的结果集
209 
210 */
211 
212 public ResultSet executeQuery(String sql) {
213 
214 ResultSet rs = null;
215 
216 try {
217 
218 rs = stmt.executeQuery(sql);
219 
220 }
221 
222 catch (SQLException e) {
223 
224 e.printStackTrace();
225 
226 }
227 
228 return rs;
229 
230 }
231 
232 /**
233 
234 * 执行一条简单的更新语句
235 
236 * 执行成功则返回true
237 
238 */
239 
240 public boolean executeUpdate(String sql) {
241 
242 boolean v = false;
243 
244 try {
245 
246 = stmt.executeUpdate(sql) > 0 ? true : false;
247 
248 }
249 
250 catch (SQLException e) {
251 
252 e.printStackTrace();
253 
254 }
255 
256 finally {
257 
258 return v;
259 
260 }
261 
262 }
263 
264 
265 
266 }