可可果

哈利是一只有白点的黑狗

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  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 }
posted on 2007-12-06 20:49  可可果  阅读(590)  评论(0编辑  收藏  举报