模式读书笔记——建造者模式"/>
大话设计模式读书笔记——建造者模式
文章目录
- 1. 前言
- 2. 需求
- 3. 代码版本1.0
- 4. 增加需求
- 5. 代码版本2.0
- 5.1 瘦人类(胖人类也类似)
- 5.2 客户端
- 5.3 弊端
- 6. 建造者模式
- 6.1 概念
- 6.2 案例代码
- 6.2.1 UML类图
- 6.2.2 产品类
- 6.2.3 抽象建造者类
- 6.2.4 具体建造者类
- 6.2.5 指挥者类
- 6.2.6 客户端
- 6.3 代码版本3.0
- 6.3.1 UML 类图
- 6.3.2 抽象的建造者类
- 6.3.3 瘦小人建造者(胖小人建造者类似)
- 6.3.4 指挥者
- 6.3.5 客户端
1. 前言
2. 需求
用程序画一个小人,要求是小人要有头、身体、两手、两脚。
3. 代码版本1.0
public class Test extends JFrame {public Test(){setSize(400,400);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setLocationRelativeTo(null);}public void paint(Graphics g){g.drawOval(150,120,30,30);g.drawRect(160,150,10,50);g.drawLine(160,150,140,200);g.drawLine(170,150,190,200);g.drawLine(160,200,145,250);g.drawLine(170,200,185,250);}public static void main(String[] args) {new Test().setVisible(true);}
}
输出结果:
4. 增加需求
再画一个身体比较胖的小人。
5. 代码版本2.0
画人的时候,头身手脚是必不可少的,开发时也是不能少。因此,可以建两个类,一个是瘦人的类,一个是胖人的类。
5.1 瘦人类(胖人类也类似)
public class PersonThinBuilder {private Graphics g;public PersonThinBuilder(Graphics g){this.g = g;}public void paint(){g.drawOval(150,120,30,30);g.drawRect(160,150,10,50);g.drawLine(160,150,140,200);g.drawLine(170,150,190,200);g.drawLine(160,200,145,250);g.drawLine(170,200,185,250);}
}
5.2 客户端
public void paint(Graphics g){//初始化瘦小人建造类PersonThinBuilder gThin = new PersonThinBuilder(g);gThin.build();//初始化胖小人建造类PersonFatBuilder gFat = new PersonThinBuilder(g);gFat.build();
}
5.3 弊端
比如现在再增加需求:加一个高个的小人。你会不会因为编程不注意,让他缺胳膊少腿呢?
因此最好的办法是规定,凡是建造小人,都必须要有头和身体,以及两手两脚。
6. 建造者模式
如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,建造者模式(Builder),又叫生成器模式。
6.1 概念
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
6.2 案例代码
6.2.1 UML类图
6.2.2 产品类
public class Product {ArrayList<String> parts = new ArrayList<String>();//添加新的产品部件public void add(String part){parts.add(part);}//列举所有产品部件public void show(){for (String part : parts) {System.out.println(part);}}
}
6.2.3 抽象建造者类
public abstract class Builder {public abstract void buildPartA();//建造部件Apublic abstract void buildPartB();//建造部件Bpublic abstract Product getResult();//得到产品
}
6.2.4 具体建造者类
public class ConcreteBuilder1 extends Builder{private Product product = new Product();@Overridepublic void buildPartA() {product.add("部件A");}@Overridepublic void buildPartB() {product.add("部件B");}@Overridepublic Product getResult() {return product;}
}
public class ConcreteBuilder2 extends Builder{private Product product = new Product();@Overridepublic void buildPartA() {product.add("部件X");}@Overridepublic void buildPartB() {product.add("部件Y");}@Overridepublic Product getResult() {return product;}
}
6.2.5 指挥者类
//指挥者
public class Director {public void construct(Builder builder){builder.buildPartA();builder.buildPartB();}
}
6.2.6 客户端
public class Client {public static void main(String[] args) {Director director = new Director();Builder b1 = new ConcreteBuilder1();Builder b2 = new ConcreteBuilder2();//指挥者用ConcreteBuilder1的方法来创建产品director.construct(b1);Product p1 = b1.getResult();p1.show();//指挥者用ConcreteBuilder2的方法来创建产品director.construct(b2);Product p2 = b2.getResult();p2.show();}
}
6.3 代码版本3.0
6.3.1 UML 类图
6.3.2 抽象的建造者类
先定义一个抽象的建造人的类,来把这个过程给稳定住,不让任何人遗忘当中的任何一步
//抽象的建造者类
public abstract class PersonBuilder {protected Graphics g;public PersonBuilder(Graphics g){this.g = g;}public abstract void buildHead();public abstract void buildBody();public abstract void buildArmLeft();public abstract void buildArmRight();public abstract void buildLegLeft();public abstract void buildLegRight();
}
6.3.3 瘦小人建造者(胖小人建造者类似)
"然后,我们需要建造一个瘦的小人,则让这个瘦子类去继承这个抽象类,那就必须去重写这些抽象方法了。
public class PersonThinBuilder extends PersonBuilder{public PersonThinBuilder(Graphics g) {super(g);}@Overridepublic void buildHead() {g.drawOval(150,120,30,30);}@Overridepublic void buildBody() {g.drawRect(160,150,10,50);}@Overridepublic void buildArmLeft() {g.drawLine(160,150,140,200);}@Overridepublic void buildArmRight() {g.drawLine(170,150,190,200);}@Overridepublic void buildLegLeft() {g.drawLine(160,200,145,250);}@Overridepublic void buildLegRight() {g.drawLine(170,200,185,250);}
}
6.3.4 指挥者
public class PersonDirector {private PersonBuilder pb;public PersonDirector(PersonBuilder pb){this.pb = pb;}//根据用户的需要建造小人public void CreatePerson(){pb.buildHead();pb.buildBody();pb.buildArmLeft();pb.buildArmRight();pb.buildLegLeft();pb.buildLegRight();}
}
6.3.5 客户端
public class Client extends JFrame {public Client(){setSize(400,400);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setLocationRelativeTo(null);}public void paint(Graphics g){PersonBuilder gThin = new PersonThinBuilder(g);PersonDirector pdThin = new PersonDirector(gThin);pdThin.CreatePerson();PersonBuilder gFat = new PersonFatBuilder(g);PersonDirector pdFat = new PersonDirector(gFat);pdFat.CreatePerson();}public static void main(String[] args) {new Client().setVisible(true);}
}
更多推荐
大话设计模式读书笔记——建造者模式
发布评论