博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Socket,SocketImpl与SocketImplFactory的关系
阅读量:6385 次
发布时间:2019-06-23

本文共 1632 字,大约阅读时间需要 5 分钟。

  这几天学到java.net包中的一些类,这三个的关系感觉和设计模式不太清楚。在此写写自己的看法,顺便整理下自己的思路。

  其中,可以肯定的是:SocketImpl是其中的核心,抽象出了对socket操作所需要的所有方法和字段,例如:connect(),accept(),getInputStream()等。它的子类是真正操作运输层数据的对象。先看下它的类结构图:

AbstractPlainSocketImpl定义了默认的Socket实现,也是抽象类。这就有个问题了:这两个都是抽象类,而且SocketImpl的直接子类只有AbstractPlainSocketImpl一个,那么为什么不合并在一起呢?

  其次,Socket是把SocketImpl包装起来,如同ServerSocket,DatagramSocket,***Socket一样。——这可能是一个适配器设计模式,不同的Socket可以用的是同一个SocketImpl,但通过自己的***Socket类构建出适合自己的类。他们都包含一个SocketImpl的子类对象,而且他们的方法都是调用SocketImpl中的方法。这点,可以从源码看出,构造时就是实例化一个SocketImpl:

 

1   public Socket() {2         setImpl();3     }

关闭就是在关闭SocketImpl:

public synchronized void close() throws IOException {        synchronized(closeLock) {            if (isClosed())                return;            if (created)                impl.close();            closed = true;        }    }

  最后,从setImpl()中能看出,SocketImplFactory的作用:

1 void setImpl() { 2         if (factory != null) { 3             impl = factory.createSocketImpl(); 4             checkOldImpl(); 5         } else { 6             // No need to do a checkOldImpl() here, we know it's an up to date 7             // SocketImpl! 8             impl = new SocksSocketImpl(); 9         }10         if (impl != null)11             impl.setSocket(this);12     }

SocketImplFactory就是创建SocketImpl的。但一般都用默认的SocketImpl,所以就用不到SocketImplFactory。且他是使用了工厂方法设计模式,通过实现createSocketImpl()方法来返回一个SocketImpl,这样就封装了创建部分的变化。

  总结一下,就是SocketImpl是实现运输层操作的抽象类。Socket、ServerSocket等封装了SocketImpl,以适应不同的操作。SocketImplFactory就是使用了工厂方法来创建SocketImpl。

PS:InetAddress类也用的是工厂方法设计模式,把创建这块的变化给封装起来的确实很好!

转载于:https://www.cnblogs.com/havener/archive/2013/03/09/2951915.html

你可能感兴趣的文章
开源项目 log4android 使用方式详解
查看>>
ssh命令详解
查看>>
C# 中字符串转换成日期
查看>>
垃圾短信相关用户细分方案
查看>>
MFC工程 重命名方法
查看>>
免费的Windows系统工具
查看>>
脚本:将git项目下载到本地并启动
查看>>
棋盘覆盖(一) ACM
查看>>
Linked List Cycle && Linked List Cycle II
查看>>
SeleniumTest
查看>>
ubuntu10.04 交叉编译 aria2 总结
查看>>
实验二 linux常用命令练习
查看>>
SPY
查看>>
base64加密解密c++代码
查看>>
json数据格式
查看>>
uva 10913 Walking on a Grid
查看>>
最大流算法入门
查看>>
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
查看>>
SpringMVC笔记
查看>>
根据类名获取元素
查看>>