原型模式揭秘:从Linux命令scp到设计模式的实践应用

每天一个 Linux 命令

scp

加密的方式在本地主机和远程主机之间复制文件

用于在 Linux 下进行远程拷贝文件的命令, 和它类似的命令有 cp, 不过 cp 只是在本机进行拷贝不能跨服务器, 而且 scp 传输是加密的. 可能会稍微影响一下速度.
当你服务器硬盘变为只读 read only system 时, 用 scp 可以帮你把文件移出来. 另外, scp 还非常不占资源, 不会提高多少系统负荷, 在这一点上, rsync
就远远不及它了. 虽然 rsync 比 scp 会快一点, 但当小文件众多的情况下, rsync 会导致硬盘 I/O 非常高, 而 scp 基本不影响系统正常使用.

1
2
3
4
5
6
7
8
9
10
11
12
13
-1: 使用 ssh 协议版本 1;
-2: 使用 ssh 协议版本 2;
-4: 使用 ipv4;
-6: 使用 ipv6;
-B: 以批处理模式运行;
-C: 使用压缩;
-F: 指定 ssh 配置文件;
-l: 指定宽带限制;
-o: 指定使用的 ssh 选项;
-P: 指定远程主机的端口号;
-p: 保留文件的最后修改时间, 最后访问时间和权限模式;
-q: 不显示复制进度;
-r: 以递归方式复制.

从远程复制文件到本地目录

1
scp root@10.10.10.10:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/

上传本地目录到远程机器指定目录

1
scp -r /opt/soft/mongodb root@10.10.10.10:/opt/soft/scptest

创建者模式之四: 原型模式

使用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象

将一个原型对象传给那个要发动创建的对象, 这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程. 由于在软件系统中我们经常会遇到需要创建多个相同或者相似对象的情况,
因此原型模式在真实开发中的使用频率还是非常高的. 原型模式是一种 “另类” 的创建型模式, 创建克隆对象的工厂就是原型类自身, 工厂方法由克隆方法来实现.

需要注意的是通过克隆方法所创建的对象是全新的对象, 它们在内存中拥有新的地址, 通常对克隆所产生的对象进行修改对原型对象不会造成任何影响,
每一个克隆对象都是相互独立的. 通过不同的方式修改可以得到一系列相似但不完全相同的对象.

UML

20241229154732_3EW1ousA.webp

Prototype (抽象原型类)
声明克隆方法的接口, 是所有具体原型类的公共父类
ConcretePrototype (具体原型类)
实现在抽象原型类中声明的克隆方法, 在克隆方法中返回自己的一个克隆对象
Client (客户类)
让一个原型对象克隆自身从而创建一个新的对象, 在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象, 再通过调用该对象的克隆方法即可得到多个相同的对象

两种通用方法实现原型模式

1. 在具体原型类的克隆方法中实例化一个与自身类型相同的对象并将其返回, 并将相关的参数传入新创建的对象中, 保证它们的成员属性相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ConcretePrototype implements Prototype{
private String attr;
public void setAttr(String attr){
this.attr = attr;
}
public String getAttr(){
return this.attr;
}
public Prototype clone(){
Prototype prototype = new ConcretePrototype();
prototype.setAttr(this.attr);
return prototype;
}
}

在 clone 方法中新创建一个实例, 并设置相应的参数再返回, 返回的实例是一个完全不同但是类型一样的对象

如果将 clone() 方法改为:

1
2
3
public Prototype clone() {
return this;
}

这样返回的对象是自身, 根本不是一个全新的对象.

客户端调用方式

1
2
3
Prototype obj1  = new ConcretePrototype();
obj1.setAttr("Sunny");
Prototype obj2 = obj1.clone();

引用

-http://blog.csdn.net/lovelion/article/details/7424559