同算法与数据结构一样,设计模式同样是作为一个优秀程序员必须熟练掌握与应用的基本功,在阅读源码或者优秀的开源项目的同时,不难发现各种设计模式的灵活运用,叹为观止。
接下来一系列博客,将和大家一起分享这些常用的设计模式。
本篇博客一起来看看建造者模式,建造者模式可以屏蔽产品的具体创建细节,并且建造者相互独立易于扩展,接下来通过一个简单的例子看看建造者模式。
这里我们来创建华为Mate20
首先定义产品类
public class Phone {
private String os;
private String brand;
private String processor;
public void setOs(String os) {
this.os = os;
}
public void setBrand(String brand) {
this.brand = brand;
}
public void setProcessor(String processor) {
this.processor = processor;
}
@Override
public String toString() {
return "os : " + os + " brand : " + brand + " processor : " + processor;
}
}
然后抽象出产品的创建方法
public abstract class PhoneBuilder {
public abstract void buildOs(String os);
public abstract void buildBrand(String brand);
public abstract void buildProcessor(String processor);
public abstract Phone create();
}
在用具体手机产品去继承抽象类
public class HuaWeiMate20Builder extends PhoneBuilder {
private Phone phone = new Phone();
@Override
public void buildOs(String os) {
phone.setOs(os);
}
@Override
public void buildBrand(String brand) {
phone.setBrand(brand);
}
@Override
public void buildProcessor(String processor) {
phone.setProcessor(processor);
}
@Override
public Phone create() {
return phone;
}
}
最后一步创建导演类,用来控制创建的过程
public class Director {
PhoneBuilder builder;
public Director(PhoneBuilder builder) {
this.builder = builder;
}
public Phone createPhone(String os, String brand, String processor) {
builder.buildOs(os);
builder.buildBrand(brand);
builder.buildProcessor(processor);
return builder.create();
}
}
至此就完成了简单的建造者模式,接下来测试一下吧
public class CreateHuaWeiMate20 {
public static void main(String[] args) {
PhoneBuilder builder = new HuaWeiMate20Builder();
Director director = new Director(builder);
Phone phone = director.createPhone("Android", "HuaWei", "HaiSi");
System.out.println(phone.toString());
}
}
以下是Kotlin代码
class Phone {
var os : String = ""
var brand : String = ""
var processor : String = ""
override fun toString(): String {
return "os : $os brand : $brand processor : $processor"
}
}
abstract class PhoneBuilder {
abstract fun setOs(os :String)
abstract fun setBrand(brand : String)
abstract fun setProcessor(processor : String)
abstract fun create() : Phone
}
class HuaWeiMate20PhoneBuilder : PhoneBuilder() {
var phone : Phone = Phone()
override fun setOs(os: String) {
phone.os = os
}
override fun setBrand(brand: String) {
phone.brand = brand
}
override fun setProcessor(processor: String) {
phone.processor = processor
}
override fun create(): Phone {
return phone
}
}
class Director(internal var builder: PhoneBuilder) {
fun createPhone(os: String, brand: String, processor: String): Phone {
builder.setOs(os)
builder.setBrand(brand)
builder.setProcessor(processor)
return builder.create()
}
}
fun main(args: Array<String>) {
val builder = HuaWeiMate20PhoneBuilder()
val director = Director(builder)
val phone = director.createPhone("Android", "HuaWei", "HaiSi")
println(phone.toString())
}