1 建造者模式?
将一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创建不同的表示。
分析:
- 复杂对象:指的要具体生产的产品。
- 复杂对象的构建:指的指挥者指挥具体的构建者去构建产品。
- 复杂对象的表示:指的生产出来的产品长啥样。
- 创建不同的表示:因为具体的创建者不同,所以创建出了不同的表示。
2 优缺点分析?
优点:
- 具体的建造者之间相互独立,这样更方便扩展。比如要增加一个新的产品,只需要增加一个新的构建者类就好了。
- 产品的创建过程(步骤,就是对应的具体构建者中的各个方法)清晰。
缺点:
- 如果产品的变化大(这个产品的部件时多时少),需要改进具体的创建类,代码改动大,不易维护。
3 demo(包含详细注释)
package com.biao.builder.againchange; import java.util.ArrayList; import java.util.List; /*客户端入口函数*/ public class BuilderDemo { public static void main(String[] args) { MealBuilder builderA = new MealA(); MealBuilder builderB = new MealB(); Director director = new Director(); director.construct(builderA); Meal mealA = builderA.getMeal(); mealA.show(1); director.construct(builderB); Meal mealB = builderB.getMeal(); mealB.show(2); } } /*创建产品的抽象类,并且为所创建产品的各个部件抽象出接口(就是一个部件对应一个方法)*/ /*一般情况,对于建造者模式,该抽象类至少包含创建部件的方法和返回对象两部分。*/ abstract class MealBuilder{ abstract void buildFood(); abstract void buildDrink(); abstract Meal getMeal(); } /*产品的具体创建类,此部分相互独立,方便进行扩展,创建出各色各样的产品*/ /*产品的具体创建类内部要维护一个产品,然后进行装配(给产品添加所需要的零件)*/ class MealA extends MealBuilder{ private Meal meal = new Meal(); @Override void buildFood() { // TODO Auto-generated method stub meal.add("一盒薯条"); } @Override void buildDrink() { // TODO Auto-generated method stub meal.add("一杯咖啡"); } @Override Meal getMeal() { return meal; } } class MealB extends MealBuilder{ private Meal meal = new Meal(); @Override void buildFood() { // TODO Auto-generated method stub meal.add("一个汉堡"); } @Override void buildDrink() { // TODO Auto-generated method stub meal.add("一杯牛奶"); } @Override Meal getMeal() { return meal; } } /*实体类:通过具体的建造者去生产*/ class Meal{ List<String> parts = new ArrayList<String>(); public void add(String part){ parts.add(part); } /*产品展示方法*/ public void show(int builder){ System.out.println("通过建造者"+builder+"生产好的产品包括:"); for (String part : parts) { System.out.println(part); } } } /*指挥者(kfc服务员),指挥如何去做这个套餐。该类和产品分离,只和产品的建造者打交道,解耦,单一职责*/ class Director{ public void construct(MealBuilder builder){ builder.buildFood(); builder.buildDrink(); } }
本文参考:http://www.cnblogs.com/chenssy/p/3307787.html#commentform
时间: 2024-11-08 22:45:46