zoukankan      html  css  js  c++  java
  • java设计模式创建篇------建造者模式

    核心思想

    将对象的构建与其表示分离,这样通过相同的构建过程可以创建不同的表示。

    具体实现

    将构建与表示分离,分为产品,建造,生产三个部分。

    构建

    生产模板

    首先我们需要一个生产的模板,这是我们需要的最终产品的抽象,我们以一个抽象类表示,我们的最终产品是这个类的继承实现。

    public abstract class Model {
    	private ArrayList<String> queue = new ArrayList<String>();
    	protected abstract void deal1();//不同的产品有不同的处理
    	protected abstract void deal2();//不同的产品有不同的处理
    	//根据处理顺序进行实际生产
    	public void run() {
    		for(int i=0;i<queue.size();i++){
    			String act = queue.get(i);
    			if(act.equals("1")){
    				deal1(); //处理1
    			}else if(act.equals("2")){
    				deal2(); //处理2
    			}
    		}
    	}
    	//设置处理顺序
    	public void setQueue(ArrayList<String> queue){
    		this.queue = queue;
    	}
    }
    

    抽象生产线

    除了产品的模板外,我们还需要一个通用的组装生产线。对不同的产品由不同的生产线生产,但是它们拥有相同的生产线抽象。

    public abstract class Builder {
    	//根据需求设置生产顺序
    	public abstract void setQueue(ArrayList<String> queue);
    	//按顺序完成生产获取成品
    	public abstract Model getModel();
    }
    

    表示

    具体产品

    具体的产品表示,假设有两种产品。

    public class Product1 extends Model {
    	protected void deal1() {
    		System.out.println("Product1的deal1是这样处理的");
    	}
    	protected void deal2() {
    		System.out.println("Product1的deal2是这样处理的");
    	}
    }
    
    public class Product2 extends Model {
    	protected void deal1() {
    		System.out.println("Product2的deal1是这样处理的");
    	}
    	protected void deal2() {
    		System.out.println("Product2的deal2是这样处理的");
    	}
    }
    

    具体生产线

    再根据不同的产品需要生成具体的两条生产线。

    //产品1的生产线
    public class Product1Builder extends Builder {
    	private Product1 p1= new Product1();
    	public Model getModel() {
    		return p1;
    	}
    	public void setQueue(ArrayList<String> queue) {
    		p1.setQueue(queue);
    	}
    }
    //产品2的生产线
    public class Product2Builder extends Builder {
    	private Product2 p2= new Product2();
    	public Model getModel() {
    		return p2;
    	}
    	public void setQueue(ArrayList<String> queue) {
    		p2.setQueue(queue);
    	}
    }
    

    建造过程

    接下来就是具体的生产过程了,我们将其封装到一个类中方便调用。

    public class Factory{
    	private ArrayList<String> queue = new ArrayList<String>();
    	private Product1Builder p1=new Product1Builder();
    	private Product2Builder p2=new Product2Builder();
    	
    	//获得第一类产品
    	public Product1 getProduct1 (){
    		queue.clear();
    		//设置的执行顺序
    		queue.add("1");
    		queue.add("2");
    		p1.setQueue(queue);
    		Product1 product1 = (Product1)p1.getModel();
    		return product1 ;
    	}
        //获得第二类产品
    	public Product2 getProduct2(){
    		queue.clear();
    		//设置的执行顺序
    		queue.add("2");
    		queue.add("1");
    		p2.setQueue(queue);
    		Product2 product2 = (Product2)p2.getModel();
    		return product2 ;
    	}
    }
    

    简单的体验一下

    public static void main(String[] args) {
    	Factory factory= new Factory ();
    	Product1 product1 = factory.getProduct1();
    	product1.run();
    	Product2 product2 = factory.getProduct2(); 
    	product2.run();
    }
    

    特点

    与工厂模式与抽象工厂相似,这一模式具有很好的封装性,保证我们可以在不知道目标内部细节的情况下建立产品。由于每个具体的生产建造类之间是相互独立的,所以具有很好的外部扩展性,各个模块之间具有独立性,相互之间不会产生影响。除此之外,建造者模式相较于工厂方法突出强调了产品类中函数调用的顺序,这是其比较重要的特点。

  • 相关阅读:
    PHP0002:PHP基础1
    NodeJS_0001:关于install的方式
    JN_0018:运行窗口不显示
    事务、事务操作、事务隔离级别
    MySQL 常见的两种存储引擎
    8:二叉树的下一个节点
    链表
    文件压缩
    MapReduce--Shuffle原理
    volatile关键字
  • 原文地址:https://www.cnblogs.com/yanzs/p/13788284.html
Copyright © 2011-2022 走看看