建造者模式
原话:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
其实就是将一个对象详细化,比如把人分为美国人、日本人、中国人、韩国人、非洲人,每一种人都有不同的肤色、身高、头部特征;
其实仔细看,建造者模式和工厂模式很像,很多人将这2者傻傻分不清楚,其实,工厂模式创建的是单个类,而建造者模式是将一个类型的东西集中起来进行管理,比如人类,它的里面会有很多分类:
1、黑皮肤、大高个、做事拖拉懒散,将这三者结合起来就成为一个类型:黑人;
2、黄皮肤、个子纤瘦、做事严谨、严丝合缝,将这四者结合起来就成为一个类型:日本人;
像肯德基或者麦当劳里面的套餐,将汉堡、可乐 、奶茶、薯条、鸡排等分别建造出来,通过不同的组合就成了1 + 1 =12的两件套套餐,
建造者模型如下图
建造者模式代码
- package com.designPatterm.create;
-
- /*
- 设计模式-- 建造者模式
- */
- public class CreateModel {
-
- public static void main(String[] args) {
- PersonDirector pb = new PersonDirector();
- Person meiguo = pb.constructPerson(new MeiGuoBuilder());
- System.out.println(meiguo.getName());
- System.out.println(meiguo.getHead());
- System.out.println(meiguo.getBody());
- System.out.println(meiguo.getColor());
-
- System.out.println("----------我是分割线-------------");
-
- Person china = pb.constructPerson(new ChinaBuilder());
- System.out.println(china.getName());
- System.out.println(china.getHead());
- System.out.println(china.getBody());
- System.out.println(china.getColor());
- }
- }
-
- // 建立一个人物对象Person
- class Person {
- private String name; // 国家人名
- private String head; // 头部特诊
- private String body; // 身体特诊
- private String color; // 肤色
-
- public String getName() { return name; }
- public void setName(String name) { this.name = name; }
- public String getHead() { return head; }
- public void setHead(String head) { this.head = head; }
- public String getBody() { return body; }
- public void setBody(String body) { this.body = body; }
- public String getColor() { return color; }
- public void setColor(String color) { this.color = color; }
- }
-
- //Builder(给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建)
- interface PersonBuilder {
- void builderName();
- void builderHead();
-
- void builderBody();
-
- void builderColor();
-
- Person BuilderPersion(); //组装
- }
-
- // 美国人 // ConcreteBuilder(实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例)
- class MeiGuoBuilder implements PersonBuilder {
- private Person person;
-
- public MeiGuoBuilder() {
- person = new Person();//创建一个Person实例,用于调用set方法
- }
-
- @Override
- public void builderName() {
- person.setName("美国人");
- }
-
- public void builderHead() {
- person.setHead("瓜子脸");
- }
-
- public void builderBody() {
- person.setBody("高大威猛");
- }
-
- public void builderColor() {
- person.setColor("白皮肤");
- }
-
- public Person BuilderPersion() {
- return person;
- }
- }
-
- // 中国人 // ConcreteBuilder(实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例)
- class ChinaBuilder implements PersonBuilder {
- private Person person;
-
- public ChinaBuilder() {
- person = new Person();//创建一个Person实例,用于调用set方法
- }
-
- @Override
- public void builderName() {
- person.setName("中国人");
- }
-
- public void builderHead() {
- person.setHead("东方人面孔");
- }
-
- public void builderBody() {
- person.setBody("身材中等");
- }
-
- public void builderColor() {
- person.setColor("黄皮肤");
- }
-
- public Person BuilderPersion() {
- return person;
- }
- }
- // Director(调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建)
- class PersonDirector {
- public Person constructPerson(PersonBuilder pb) {
- pb.builderName();
- pb.builderHead();
- pb.builderBody();
- pb.builderColor();
- return pb.BuilderPersion();
- }
- }
打印结果
- 美国人
- 瓜子脸
- 高大威猛
- 白皮肤
- ----------我是分割线-------------
- 中国人
- 东方人面孔
- 身材中等
- 黄皮肤
-
- Process finished with exit code 0