文章目录
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();//建造部件A
public abstract void buildPartB();//建造部件B
public abstract Product getResult();//得到产品
}
6.2.4 具体建造者类
public class ConcreteBuilder1 extends Builder{
private Product product = new Product();
@Override
public void buildPartA() {
product.add("部件A");
}
@Override
public void buildPartB() {
product.add("部件B");
}
@Override
public Product getResult() {
return product;
}
}
public class ConcreteBuilder2 extends Builder{
private Product product = new Product();
@Override
public void buildPartA() {
product.add("部件X");
}
@Override
public void buildPartB() {
product.add("部件Y");
}
@Override
public 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);
}
@Override
public void buildHead() {
g.drawOval(150,120,30,30);
}
@Override
public void buildBody() {
g.drawRect(160,150,10,50);
}
@Override
public void buildArmLeft() {
g.drawLine(160,150,140,200);
}
@Override
public void buildArmRight() {
g.drawLine(170,150,190,200);
}
@Override
public void buildLegLeft() {
g.drawLine(160,200,145,250);
}
@Override
public 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);
}
}