zoukankan      html  css  js  c++  java
  • 设计模式builder(构造器模式)

    设计模式-builder(构造器模式)

    Bilder模式定义:

            将一个复杂对象的构建和表示分离,是同样的创建构建过程可以创造不同的表示。
     
         Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用用不知道内部的具体构建细节。Builder模式是非常类似抽象工厂模式,细微的区别大概只是在反复使用中才能体会到。

    为何使用建造者模式

         是为了将复杂对象的构建过程与它的部件分离。注意: 是解耦过程和部件。


        因为一个复杂的对象,不但有很多大量组成部分。例如汽车,有很多部件:车轮、方向盘、发动机,还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配过程也很复杂(需要很好的组装技术),Builder模式就是为了将部件和组装过程分开。

    建造者模式典型结构图





    如何使用建造者模式

         首先假设一个复杂对象是由多个部件组成的,Builder模式是吧复杂对象的创建和部件的创建分开来,分别用Director和Builder类来表示。


    如果需要一个接口来创建部件:

    package com.designpatten.builder;
    
    
    public interface Builder {
    	void buildCarWheel() ;
    	void buildSteeringWheel() ;
    	void buildEngine() ;
    	void buildCarFrame() ;
    	Car getCar() ;
    }

    在Director中构建复杂对象,将Builder中定义的一个一个部件组装起来。

    package com.designpatten.builder;
    
    public class Director {
    
    	private Builder builder ;
    	
    	public Director(Builder builder){
    		this.builder = builder ;
    	}
    	
    	public void getCarTogether(){
    		builder.buildCarFrame() ;
    		builder.buildEngine();
    		builder.buildCarWheel() ;
    		builder.buildSteeringWheel() ;
    	}
    	
    }
    
    实现具体的Builder:

    • 通过实现接口,来完成部件的构建过程
    • 重新获得目标对象接口
    package com.designpatten.builder;
    
    public class BenzBuilder implements Builder {
    
    	private Benz benz ;
    	
    	public BenzBuilder(){
    		benz = new Benz() ;
    	}
    	
    	@Override
    	public void buildCarWheel() {
    		System.out.println("Benz add Wheel");
    	}
    
    	@Override
    	public void buildSteeringWheel() {
    		System.out.println("Benz add SteeringWheel");
    	}
    
    	@Override
    	public void buildEngine() {
    		System.out.println("Benz add engine");
    	}
    
    	@Override
    	public void buildCarFrame() {
    		System.out.println("Benz add frame");
    	}
    
    	@Override
    	public Car getCar() {
    		return benz;
    	}
    
    }
    
    package com.designpatten.builder;
    
    
    public class BMWBuilder implements Builder {
    
    
    	private BMW bmw ; 
    	
    	public BMWBuilder(){
    		bmw = new BMW() ;
    	}
    	
    	@Override
    	public void buildCarWheel() {
    		System.out.println("BMW add CarWheel");
    	}
    
    
    	@Override
    	public void buildSteeringWheel() {
    		System.out.println("BMW add SteeringWheel");
    	}
    
    
    	@Override
    	public void buildEngine() {
    		System.out.println("BMW add Engine");
    	}
    
    
    	@Override
    	public void buildCarFrame() {
    		System.out.println("BMW add Frame");
    	}
    
    
    	@Override
    	public Car getCar() {
    		return bmw;
    	}
    
    
    }
    具体的产品信息

    package com.designpatten.builder;
    
    public interface Car {
    	
    	void run() ;
    	
    }
    

    package com.designpatten.builder;
    
    public class BMW implements Car {
    
    	@Override
    	public void run() {
    		System.out.println("BMW ---> run()");
    	}
    
    }
    
    package com.designpatten.builder;
    
    public class Benz implements Car {
    
    	@Override
    	public void run() {
    		System.out.println("Benz -------> run()");
    	}
    
    }
    
    生产Car

    package com.designpatten.builder;
    
    public class Client {
    	public static void main(String[] args) {
    		BenzBuilder benzBuilder = new BenzBuilder() ;
    		BMWBuilder bmwBuilder = new BMWBuilder() ;
    		
    		Director benzDirector = new Director(benzBuilder) ;
    		benzDirector.getCarTogether() ;
    		Car benz = benzBuilder.getCar() ;
    		benz.run() ;
    		System.out.println("----------------------------");
    		Director bmwDirector = new Director(bmwBuilder) ;
    		bmwDirector.getCarTogether() ;
    		Car bmw = bmwBuilder.getCar() ;
    		bmw.run() ;
    	}
    }
    

    输出结构

    Benz add frame
    Benz add engine
    Benz add Wheel
    Benz add SteeringWheel
    Benz -------> run()
    ----------------------------
    BMW add Frame
    BMW add Engine
    BMW add CarWheel
    BMW add SteeringWheel
    BMW ---> run()
    


    参考:http://www.weixueyuan.net/view/6110.html

           C++设计模式

           http://www.iteye.com/topic/71175

              http://www.cnblogs.com/moonz-wu/archive/2011/01/11/1932473.html   

  • 相关阅读:
    信号
    序列化数据的两种方式
    ModelForm的使用
    分页模板
    Django中间件进行用户登陆验证
    Flask 笔记一
    pipenv 使用基本命令
    git本地文件 上传 远程仓库
    service "$service" status 返回的状态
    &>/dev/null 的作用
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207267.html
Copyright © 2011-2022 走看看