zoukankan      html  css  js  c++  java
  • 建造者模式

    定义

    将一个复杂对象的创建与它的表示(部件与装配细节)相分离,使得同样的创建过程可以创建不同的表示。

    使用场景

    1. 可以将装配细节封装起来,调用者不必知道具体的产品的内部结构和产生过程。
    2. 多个部件,都装配到一个对象,不同的装配过程或者不同的装配顺序,产生不同的结果,可以使用该模式

    实现方式

    产品类

    public class Product 
    {
        private String partA; 
        private String partB;
        private String partC;
        //Getter方法和Setter方法省略
    }
    

    抽象建造类,不同的建造过程实现Builder接口即可

    public abstract class Builder
    {
        protected Product product=new Product();
        
        public abstract void PartA();
        public abstract void PartB();
        public abstract void PartC();
        
        public Product build()
        {
            return product;
        }
    } 
    

    具体建造者。实现抽象接口,构建和装配各个部件

    public class ConcreteBuilder extends Builder{
        public void PartA(){
        ...
        }
        public void PartB(){
        ...
        }
        public void PartC(){
        ...
        }
    }
    

    指挥者类的代码,该类的作用主要有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。

    public class Director
    {
        private Builder builder;
        
        //1 构造方法的方式注入builder对象
        public Director(Builder builder)
        {
            this.builder=builder;
        }
        
        public Product construct()
        {
            builder.PartA();
            builder.PartB();
            builder.PartC();
            return builder.getResult();
        }
    } 
    

    客户端调用,无须关心产品对象的具体组装过程,只需确定具体建造者的类型即可。

    Builder builder = new ConcreteBuilder();
    Director director = new Director(builder);
    Product product = director.construct();
    

    扩展与思考

    1. 建造者模式和工厂方法模式的类图相似,建造者模式关注零件类型和装配工艺(顺序),工厂方法侧重产品创建,不关心组装顺序。
    2. 建造者模式的建造者通常可以采用链式编程方式类似JQuery,也可以参考Spring的BeanDefinitionBuilder类。该类只能使用静态方法创建BeanDefinitionBuilder,其属性赋值方法又返回this对象本身,可以继续进行属性赋值,最后使用getRawBeanDefinition或者getBeanDefinition方法来获取BeanDefinition。当然也可以使用具体的类创建,但是没有BeanDefinitionBuilder方便。
    public class BeanDefinitionBuilder {
    
    	public static BeanDefinitionBuilder genericBeanDefinition() {
    		BeanDefinitionBuilder builder = new BeanDefinitionBuilder();
    		builder.beanDefinition = new GenericBeanDefinition();
    		return builder;
    	}
    
    	public static BeanDefinitionBuilder genericBeanDefinition(Class<?> beanClass) {
    		BeanDefinitionBuilder builder = new BeanDefinitionBuilder();
    		builder.beanDefinition = new GenericBeanDefinition();
    		builder.beanDefinition.setBeanClass(beanClass);
    		return builder;
    	}
    
    	public static BeanDefinitionBuilder genericBeanDefinition(String beanClassName) {
    		...
    	}
        
        private AbstractBeanDefinition beanDefinition;
    
    	private int constructorArgIndex;
    
    	private BeanDefinitionBuilder() {
    	}
    
    	public AbstractBeanDefinition getRawBeanDefinition() {
    		return this.beanDefinition;
    	}
    
    	public AbstractBeanDefinition getBeanDefinition() {
    		this.beanDefinition.validate();
    		return this.beanDefinition;
    	}
        
        public BeanDefinitionBuilder setLazyInit(boolean lazy) {
    		this.beanDefinition.setLazyInit(lazy);
    		return this;
    	}
    
    	public BeanDefinitionBuilder setAutowireMode(int autowireMode) {
    		beanDefinition.setAutowireMode(autowireMode);
    		return this;
    	}
    	...
    }   
    
  • 相关阅读:
    解决:导出excel身份证号码显示为科学计数法
    6个出色的基于JQuery的Tab选项卡实例2010/01/29 16:261. jQuery 选项卡界面 / 选项卡结构菜单教程
    dhl:禁用firefox缓存
    artDialog4.0.5
    dhl:解除ASP.NET上传文件大小限制
    dhl:样式在ie不同浏览器下呈现不出来的原因分析
    dhl:artDialog 3.0.4 跨框架下 穿越的问题
    jQuery 1.7 正式版已经可以下载使用。jQuery是一个JavaScript库,它简化了HTML文档遍历,事件处理,动画和为网络快速发展的Ajax交互。jQuery 1.7 版本加入了新的事件API .on() 和 .off(),提
    无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。
    专家视角看IT与架构
  • 原文地址:https://www.cnblogs.com/fzsyw/p/11320149.html
Copyright © 2011-2022 走看看