設計模式--建造者模式

發這個文章到首頁的主要目的,是不知道爲何UML圖中,程傑大佬用的是聚合關係,而我只能看到依賴關係,百思不得其解,還請各位大俠可以在評論區爲我解答!!!!!!!java

將一個複雜對象的構件與它的表示分離,是的一樣的構建能夠建立不一樣的表示。算法

對象性質的建造

  • 有些狀況下,一個對象會有一些重要的性質,在它們沒有恰當的值以前,對象不能做爲一個完整的產品使用。
  • 有些狀況下,一個對象的一些性質必須按照某個順序複製纔有意義。在某個性質沒有賦值以前,另外一個性質則沒法賦值。這些狀況是的性質自己的建造涉及到複雜的商業邏輯。
  • 這時候,此對象至關於一個有待建造的產品,而對象的這些性質至關於產品的零件,建造產品的過程就是組合零件的過程。因爲組合零件的過程很複雜,所以,這些「零件」的組合過程每每被「外部化」到一個稱做建造者的對象裏,建造者返還給客戶端的是一個所有零件都建造完畢的產品對象。

思路

先把構建過程獨立出來,在建造者模式中把它稱爲指導者,由他來知道裝配過程。但不負責每步具體的實現。
要有能具體實現每步的對象,稱之爲建造者或者生成器。ide

使用場景

  • 須要生成的產品對象有複雜的內部結構。
  • 須要生成的產品對象的屬性相互依賴,建造者模式能夠強迫生成順序。
  • 在對象建立過程當中會使用到系統中的一些其餘對象,這些對象在產品對象的建立過程當中不易獲得

優勢

  • 建造者模式的使用是的產品的內部表象能夠獨立的變化。使用建造者模式可使客戶端沒必要知道產品內部組成的細節。
  • 每個Builder都相對立,而與其餘的Builder無關。
  • 模式所建造的最終產品更易於控制。

缺點

  • 產品必須有共同點,範圍有限制。好比不一樣口味的漢堡,不一樣口味的炸雞;
  • 如內部變化複雜,會有不少的建造類。

本質

分離總體構件算法和部件構造。ui

實現

UML

在這裏插入圖片描述
產品類,由N個部件組成code

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,好比是作雞腿堡,那麼第一步是炸雞腿blog

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;
	}
}

指導者,相似監工,經理這一類的。
客戶要了個雞腿堡,他會讓雞腿堡的製做者,去幹活,他只看到炸雞腿了,也烤麪包了,具體細節,他不用知道,只要不偷懶就行。get

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());
	}
}
相關文章
相關標籤/搜索