rust的类包中大量的使用了工厂模式,来构造对象。如下几个常用典型工厂模式
1. Thread的工厂Builder
看下面这段代码
use std::thread;
let builder = thread::Builder::new()
.name("foo".into())
.stack_size(32 * 1024);
let handler = builder.spawn(|| {
// thread code
}).unwrap();
handler.join().unwrap();
Builder提供了二个方法:
- stack_size设置线程栈大小
- name对线程进行命名
然后用builder.spawn方法创建线程,Builder是个典型的工厂模式。
2. File的工厂OpenOptions
见下面代码:
use std::fs::OpenOptions;
let file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open("foo.txt");
let file = OpenOptions::new().append(true).open("foo.txt");
let file = OpenOptions::new().write(true).truncate(true).open("foo.txt");
OpenOptions提供了一系列的方法来打开文件:
- read 设置文件可读
- write 设置文件可写
- create 创建一个新文件,如果存在就打开它
- append 文件内容追加模式
- truncate 覆盖原有内容
3. process的工厂Command
见下面代码
use std::process::Command;
Command::new("ls")
.current_dir("/bin")
.spawn()
.expect("ls command failed to start");
Command::new("ls")
.arg("-l")
.arg("-a")
.spawn()
.expect("ls command failed to start");
Command::new("ls")
.args(["-l", "-a"])
.spawn()
.expect("ls command failed to start");
Command::new("ls")
.env("PATH", "/bin")
.spawn()
.expect("ls command failed to start");
Command::new("printenv")
.stdin(Stdio::null())
.stdout(Stdio::inherit())
.env_clear()
.envs(&filtered_env)
.spawn()
.expect("printenv failed to start");
let output = Command::new("/bin/cat")
.arg("file.txt")
.output()
.expect("failed to execute process");
Command为进程提供了一系列的构造方法
- new 新建一个Command,并指明具体的进程
- arg 指定进程参数,即命令行中的参数
- args 指定进程参数数组
- env 设置进程环境变量
- env_clear清除环境变量
- current_dir 设置当前目录
- stdin 设置输入
- stderr设置错误
4 小结
学习一个新的类包的时候,我们可以快速的扫描一下数据结构,看有否结构体是负责工程模式的,加速类包学习。另外如果我们自己写一个工厂模式,也借鉴相关的写法,特别是连贯式表达式写法。
网友评论