将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式的使用场景
1)相同的方法,不同的执行顺序,产生不同的事件结果时,可以使用建造者模式。
2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不想同时,可以使用建造者模式。
3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这时候可以使用建造者模式。
4)在对象创建过程中会使用到系统的一些其他对象,这些对象在产品对象的创建过程中不易得到,也可以采用建造者模式封装该对象的创建过程。这种场景只能是一个补偿的方法,因为一个对象不容易获得,而在设计阶段竟然没有发现,而要通过设计这模式来柔化创建过程,本身设计已经出问题了。
为什么使用建造者模式
1)封装性:使用建造者模式可以是客户端不必知道产品内部组成的细节。
2)建造者独立,容易扩展:BenzBuilder和BMWBuilder是相互独立的,对系统扩展非常有利。
3)便于控制细节风险:由于具体的建造者是独立的,因此可以对建造者过程逐步细化,而不对其他的模块产生任何影响。
案例
最开始创建的抽象类:HouseModel
/** * @author *min * @create 2021-07-25 21:15 * @description 房屋的模型,抽象类 */ public abstract class HouseModel { //数组,通过这个数组的顺序内容来决定执行什么操作 private ArrayList<String> arrayList=new ArrayList<>(); //起围墙 public abstract void wall(); //盖房顶 public abstract void roof(); //增加屋内装饰 public abstract void add(); //增加灯光效果 public abstract void light(); public void buildHouse(){ for (int i = 0; i < arrayList.size(); i++) { String s = arrayList.get(i); if(s.equals("wall")){ wall(); }else if(s.equals("roof")){ roof(); }else if(s.equals("add")){ add(); }else if(s.equals("light")){ light(); } } } public ArrayList<String> getArrayList() { return arrayList; } public void setArrayList(ArrayList<String> arrayList) { this.arrayList = arrayList; } }
两个继承它的子类,Air和Best
/** * @author *min * @create 2021-07-25 21:29 * @description 在太空中的房子,从屋顶开始建造 */ public class AirHouseModel extends HouseModel { @Override public void wall() { System.out.println("防辐射墙壁"); } @Override public void roof() { System.out.println("防辐射屋顶"); } @Override public void add() { System.out.println("并没有什么装饰"); } @Override public void light() { System.out.println("太阳光"); } } /** * @author *min * @create 2021-07-25 21:33 * @description 建造最好的房屋需要使用其模型 */ public class BestBuilder extends HouseBuilder { //使用了相应的房屋模型 BestHouseModel bestHouseModel=new BestHouseModel(); @Override public void setArrayList(ArrayList<String> list) { bestHouseModel.setArrayList(list); } @Override public BestHouseModel getModel() { return bestHouseModel; } }
建造者的抽象类 houseBuilder
/** * @author *min * @create 2021-07-25 21:31 * @description */ public abstract class HouseBuilder { public abstract void setArrayList(ArrayList<String> list); public abstract HouseModel getModel(); }
两个实现它的子类best 和air
/** * @author *min * @create 2021-07-25 21:38 * @description 建造太空房需要其模型 */ public class AirBuilder extends HouseBuilder { AirHouseModel airHouseModel=new AirHouseModel(); @Override public void setArrayList(ArrayList<String> list) { airHouseModel.setArrayList(list); } @Override public AirHouseModel getModel() { return airHouseModel; } } /** * @author *min * @create 2021-07-25 21:33 * @description 建造最好的房屋需要使用其模型 */ public class BestBuilder extends HouseBuilder { //使用了相应的房屋模型 BestHouseModel bestHouseModel=new BestHouseModel(); @Override public void setArrayList(ArrayList<String> list) { bestHouseModel.setArrayList(list); } @Override public BestHouseModel getModel() { return bestHouseModel; } }
导航类
/** * @author *min * @create 2021-07-25 21:41 * @description 向导类,引导应该怎么具体的建造特定的房子 */ public class Director { ArrayList<String> list = new ArrayList<>(); BestBuilder bestBuilder = new BestBuilder(); AirBuilder airBuilder = new AirBuilder(); public AirHouseModel getAirHouseModel(){ list.clear(); list.add("roof"); list.add("light"); list.add("wall"); list.add("add"); airBuilder.setArrayList(list); return airBuilder.getModel(); } public BestHouseModel getBestHouseModel(){ list.clear(); list.add("wall"); list.add("add"); list.add("roof"); list.add("light"); bestBuilder.setArrayList(list); return bestBuilder.getModel(); } }