版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/M_WBCG/article/details/70801020
首先先来了解一下什么是单例模式?
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
Java单例模式例子
public class SingletonClass{
private static volatile SingletonClass instance=null;
public static SingletonClass getInstance(){
synchronized(SingletonClass.class){
if(instance==null){
instance=new SingletonClass();
}
}
return instance;
}
private SingletonClass(){}
}
优点
一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点
一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用
new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
接下来在Android中使用单例模式创建socket类
public class SocketUtil {
private static final String ADDRESS = SocketConstant.ADDRESS;
private static final int PORT = SocketConstant.PORT;
public static Socket socket = null;
public static BufferedReader br = null;
public static OutputStream out = null;
public static Activity activity = null;
/**
* 连接socket
*
* @throws IOException
*/
public static void connectSocket() {
new Thread() {
public void run() {
try {
Log.i("ConnectSocket", "进行连接服务端");
socket = new Socket(ADDRESS, PORT);
Log.i("ConnectSocket", "连接服务端成功");
//获取输入输出流
getSocketStream();
//启动接受消息的线程
startReadMsgThread();
sendMsg("你好.好",1);
} catch (IOException e) {
Log.i("ConnectSocket", "socket连接失败");
e.printStackTrace();
}
}
/**
* 获取Socket通道输入、输出流,并在此将socket信息传到Bean中
*
* @throws IOException
*/
public void getSocketStream() throws IOException {
// 获取socket通道的输入、输出流
// 将输入流放到buffer中,可以用readLine来读取信息
Log.i("ConnectSocket", "开始获取输入输出流");
out = socket.getOutputStream();
br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));
Log.i("ConnectSocket", "输入输出流获取完毕,out为:" + out + "br为:" + br);
}
}.start();
}
/**
* 调用接受服务端消息的方法,启动接受消息的线程
*/
public static void startReadMsgThread() {
new Thread() {
public void run() {
Log.i("ConnectSocket", "接受消息的线程启动成功!!!");
while (true) {
Log.i("ConnectScoket", "正在接受消息。。。。");
try {
Log.i("ServerToClient", br.readLine());
// Intent intent = new Intent(activity, MainActivity.class);
// activity.startActivity(intent);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
}
/**
* 启动发送消息的线程
* 将消息传入到编辑消息的方法中先进行预处理
*
* @param msg 未经过处理的消息内容
* @param type 消息类型
*/
public static void sendMsg(String msg, int type) {
msg = new EditSendMsgDaoImpl().EditSendMsg(msg, type);
startSendMsgThread(msg);
}
/**
* 调用服务端发送消息的方法,启动发送消息的线程
*/
public static void startSendMsgThread(String msg) {
final String sendMsg = msg;
new Thread() {
public void run() {
Log.i("ConnectSocket", "发送消息的进程启动!!!");
try {
Log.i("EditSendMsg", sendMsg);
out.write(sendMsg.getBytes());
Log.i("ConnectSocket", "发送消息成功!!!");
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
/**
* 设置进行跳转的activity
*
* @param activity 上下文的activity
*/
public void setActivity(Activity activity) {
this.activity = activity;
}
/**
* 关闭socket
*
* @param socket
* @throws IOException
*/
public static void closeSocket(Socket socket) throws IOException {
socket.close();
}
/**
* 关闭缓冲读取流
*
* @param br
* @throws IOException
*/
public static void closeBufferedReader(BufferedReader br) throws IOException {
br.close();
}
/**
* 关闭输出流
*
* @param out
*/
public static void closeOutputStream(OutputStream out) throws IOException {
out.close();
}
}
使套接字,输入输出流都已static创建的好处就是在不同的类中都可以对Socket对象进行操作。