1. 程式人生 > 其它 >設計模式-建造者模式例項-01

設計模式-建造者模式例項-01

設計模式-建造者模式例項-01

要點:

建立一個複雜物件。

優點:

客戶端不必知道產品內部組成細節,將產品本身和產品建立過程解耦,使相同建立過程可建立不同產品物件;

具體建造者相對獨立,方便替換和增加,符合開閉原則;

可以更精細地控制產品建立過程。

缺點:

產品間差異性大的時候不適用;

內部變化複雜的話需要定義很多具體建造者類來實現變化。

適用環境:

將一個複雜物件的構建與它的表示分離,使同樣的構造過程可以建立不同的表示。

例項1:KFC套餐AB的建立。

類圖

程式碼實現:

程式碼結構:

 

Meal.java:

//產品類Meal(套餐類)
public class Meal {
    private
String food; private String drink; public String getFood() { return food; } public void setFood(String food) { this.food = food; } public String getDrink() { return drink; } public void setDrink(String drink) { this.drink = drink; } }

 

MealBuilder.java:

//套餐建造者類
public abstract class MealBuilder {
    protected Meal meal = new Meal();
    public abstract void buildFood();
    public abstract void buildDrink();

    public Meal getMeal(){
        return meal;
    }
}

 

SubMealBuilder:

SubMealBuilderA.java:

import BuilderPattern.MealBuilder;

public class SubMealBuilderA extends MealBuilder { public void buildFood(){ meal.setFood("set a drumsticks!"); } public void buildDrink(){ meal.setDrink("set a cola!"); } }

 

SubMealBuilderB.java:

import BuilderPattern.MealBuilder;

public class SubMealBuilderB extends MealBuilder {
    public void buildFood(){
        meal.setFood("set a Chicken Rolls");
    }
    public void buildDrink(){
        meal.setDrink("set a juice");
    }
}

 

KFCWaiter.java:

public class KFCWaiter {
    private MealBuilder mb;
    public void setMealBuilder(MealBuilder mb){
        this.mb = mb;
    }

    public Meal construct(){
        mb.buildFood();
        mb.buildDrink();
        return mb.getMeal();
    }
}

 

XMLUtils.java:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.SAXException;
import java.io.*;

    public class XMLUtils {
        public static Object getBean(){
            try {
                //建立文件物件
                DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = dFactory.newDocumentBuilder();
                Document doc;
                doc = builder.parse(new File("src/BuilderPattern/utils/config.xml"));
                //獲取包含支付方式名稱的文字節點
                NodeList nl = doc.getElementsByTagName("className");
                Node classNode=nl.item(0).getFirstChild();
                String cName=classNode.getNodeValue();
                //通過類名生成例項物件並將其返回
                Class c=Class.forName(cName);
                Object obj=c.newInstance();
                return obj;
            }catch (Exception e){
                e.printStackTrace();
                return null;
            }
        }
    }

 

config.xml:

<?xml version="1.0"?>
<config>
    <className>BuilderPattern.SubMealBuilder.SubMealBuilderA</className>
</config>

 

Client.java:

import BuilderPattern.utils.XMLUtils;
import abstractTVFactory.utils.XMLUtil;

public class Client {
    public static void main(String[] args) {
        //動態確定套餐種類
        MealBuilder mb = (MealBuilder) XMLUtils.getBean();
        //服務員是指揮者
        KFCWaiter waiter = new KFCWaiter();
        //服務員準備套餐
        waiter.setMealBuilder(mb);
        //客戶獲得套餐
        Meal meal = waiter.construct();

        System.out.println("套餐組成:");
        System.out.println(meal.getFood());
        System.out.println(meal.getDrink());

    }
}

測試結果: