c# 建造者模式


面向对象基础:抽象 封装 多态 继承
面向对象原则:封装变化 多用组合 少用继承 针对接口编程 依赖抽象 不依赖具体 尽量松耦合 对修改关闭 对扩展开放



建造者模式简介

按照一定的接口规范扩展一个类,我们都可以把这种设计风格称之为“建造者模式”。
使用建造者模式可以保证一个实例对象的创建,都是采用同一的流程进行构造。
常见的建造者模式: 建设大厦的流程
1 首先 打桩
2 建地下车库
3 开始建设框架
4 外墙装修
5 内部设施(水电)安装
6 内装
7 交付使用


建造者模式组成:
Builder:一个抽象接口,为产品类指定抽象接口。
ConcreteBuilder:
实现Builder抽象接口,使用此接口构造各部分
提供一个返回产品的接口
Director:
调用创建者(builder)组建产品,运行builder抽象接口中的方法生成产品,
在Director中规定了建造产品的流程
Product:
建造完成的实体对象放入此类中进行存储和此类可以对外展示实体的各种功能


建造者模式的优点:
1 使用建造者模式可以使建造某一产品的工序得到有效的封装,建造顺序得到有效的封装,保证了系统稳定性。
2 建造者模式易于扩展,当有新的产品产生时,可以通过引入一个新的ConcreteBuilder来完成新的产品创建


建造者模式应用场景

支持多种数据库的 DB操作类是一种近似建造者模式的实现。
创建具有相同属性的一类对象。

下文将举例使用建造者模式的设置大厦属性(使用建造者模式构建操作类)

 /*设置产品类*/

 public class Product {  
    private String   builderName;  
    private DateTime builderDate;  
    public void showProduct(){  
        Console.WriteLine("大厦名称:"+builderName);  
        Console.WriteLine("建造年份:"+builderDate);  
    }  
    public void setBuilderName(String builderName) {  
        this.builderName = builderName;  
    }  
    public void setDate(String builderDate) {  
        this.builderDate = builderDate;  
    }  
}  

  

/*
设置一个抽象接口
*/
abstract class Builder {  
    public abstract void setPart(String arg1, String arg2);  
    public abstract Product getProduct();  
}  



class ConcreteBuilder:Builder {  
    private Product product = new Product();  
      
    public Product getProduct() {  
        return product;  
    }  
  
    public void setPart(String arg1, String arg2) {  
        product.setBuilderName(arg1);  
        product.setDate(arg2);  
    }  
}  
  
public class Director {  
    private Builder builder = new ConcreteBuilder();  
    public Product getAProduct(){  
        builder.setPart("maomao365.com大厦",(DateTime)"2017-2-6");  
        return builder.getProduct();  
    }  
    public Product getBProduct(){  
        builder.setPart("猫猫小屋",(DateTime)"2017-3-6");  
        return builder.getProduct();  
    }  
}  


/*
客户端应用
*/
public class Client {  
    public static void main(String[] args){  
        Director director = new Director();  
        Product product1 = director.getAProduct();  
        product1.showProduct();  
  
        Product product2 = director.getBProduct();  
        product2.showProduct();  
    }  
}