zoukankan      html  css  js  c++  java
  • 『设计模式』麦当劳的秘密建造者模式

    23种设计模式+额外常用设计模式汇总 (持续更新)
    将一个复杂对象的构件与它的表示分离,是的同样的构建可以创建不同的表示。

    对象性质的建造

    • 有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。
    • 有些情况下,一个对象的一些性质必须按照某个顺序复制才有意义。在某个性质没有赋值之前,另一个性质则无法赋值。这些情况是的性质本身的建造涉及到复杂的商业逻辑。
    • 这时候,此对象相当于一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程就是组合零件的过程。由于组合零件的过程很复杂,因此,这些“零件”的组合过程往往被“外部化”到一个称作建造者的对象里,建造者返还给客户端的是一个全部零件都建造完毕的产品对象。

    思路

    先把构建过程独立出来,在建造者模式中把它称为指导者,由他来知道装配过程。但不负责每步具体的实现。
    要有能具体实现每步的对象,称之为建造者或者生成器。

    使用场景

    • 需要生成的产品对象有复杂的内部结构。
    • 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
    • 在对象创建过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到

    优点

    • 建造者模式的使用是的产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
    • 每一个Builder都相对立,而与其他的Builder无关。
    • 模式所建造的最终产品更易于控制。

    缺点

    • 产品必须有共同点,范围有限制。比如不同口味的汉堡,不同口味的炸鸡;
    • 如内部变化复杂,会有很多的建造类。

    本质

    分离整体构件算法和部件构造。

    实现

    UML

    在这里插入图片描述
    产品类,由N个部件组成

    package 建造者模式;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Product {
    	List <String> concrete_Elements=new ArrayList<>();
    	public void  add(String s)
    	{
    		concrete_Elements.add(s);
    	}
    	public String getProduct()
    	{
    		
    		String s="产品构成:";
    		for(String a:concrete_Elements)
    		{
    			s=s+" "+a;
    		}
    		return s;
    	}
    }
    

    建造者类,比如做汉堡的方法,步骤一做夹层,步骤二做汉堡的面包

    package 建造者模式; 
    
    public abstract class Builder {
     
    	abstract public void Build_PartA();//步骤1
    	abstract public void Build_PartB();//步骤2
    	abstract public Product Get_Product();//得到产品
    }
    
    

    实际建造者类1,比如是做鸡腿堡,那么第一步是炸鸡腿

    package 建造者模式;
    
    public class Concrete_Builder_Type_1 extends Builder {
    	private Product Pro=new Product();
    	@Override
    	public void Build_PartA() {
    		// TODO Auto-generated method stub
    		Pro.add("产品1的组件A");
    	}
    
    	@Override
    	public void Build_PartB() {
    		// TODO Auto-generated method stub
    		Pro.add("产品1的组件B");
    	}
    
    	@Override
    	public Product Get_Product() {
    		// TODO Auto-generated method stub
    		return Pro;
    	}
    }
    
    

    实际建造者类2,比如是做大牛肉堡,那么第一步是煎牛肉,第二步是烤一个大汉堡的面包

    package 建造者模式;
    
    public class Concrete_Builder_Type_2 extends Builder {
    	private Product Pro=new Product();
    	@Override
    	public void Build_PartA() {
    		// TODO Auto-generated method stub
    		Pro.add("产品2的组件A");
    	}
    
    	@Override
    	public void Build_PartB() {
    		// TODO Auto-generated method stub
    		Pro.add("产品2的组件B");
    	}
    
    	@Override
    	public Product Get_Product() {
    		// TODO Auto-generated method stub
    		return Pro;
    	}
    }
    
    

    指导者,类似监工,经理这一类的。
    客户要了个鸡腿堡,他会让鸡腿堡的制作者,去干活,他只看到炸鸡腿了,也烤面包了,具体细节,他不用知道,只要不偷懒就行。

    package 建造者模式;
    
    public class Director {
    	 public void Construct(Builder builder)
    	 {
    		 builder.Build_PartA();
    		 builder.Build_PartB();
    	 }
    }
    
    

    客户端,类比点餐系统

    package 建造者模式;
    
    public class Client {
    	public static void main(String[] args) {
    		Director dio=new Director();//建造指挥者
    		
    		Builder buil1=new Concrete_Builder_Type_1()  ; //产品1的建造者
    		Builder buil2=new Concrete_Builder_Type_1()  ;//产品2的建造者
    		
    		dio.Construct(buil1);//指挥1号生产产品1
    		Product pro1=buil1.Get_Product();// 从1号手里拿到商品
    		System.out.println(pro1.getProduct());
    		
    		dio.Construct(buil2);//指挥2号生产产品2
    		Product pro2=buil1.Get_Product();// 从2号手里拿到商品
    		System.out.println(pro2.getProduct());
    	}
    }
    
    
  • 相关阅读:
    积水路面Wet Road Materials 2.3
    门控时钟问题
    饮料机问题
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number (莫队)
    Educational Codeforces Round 82 (Rated for Div. 2)部分题解
    Educational Codeforces Round 86 (Rated for Div. 2)部分题解
    Grakn Forces 2020部分题解
    2020 年百度之星·程序设计大赛
    POJ Nearest Common Ancestors (RMQ+树上dfs序求LCA)
    算法竞赛进阶指南 聚会 (LCA)
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/13499490.html
Copyright © 2011-2022 走看看