模式——建造者模式"/>
大话设计模式——建造者模式
建造小人一
import java.awt.Color;
import java.awt.Graphics;import javax.swing.JPanel;/*** 身体比较瘦的小人*/
public class MyPanel1 extends JPanel{public void paint(Graphics g){super.paint(g);g.setColor(Color.RED);g.drawOval(50, 20, 30, 30); // 头g.drawRect(60, 50, 10, 50); // 身体g.drawLine(60, 50, 40, 100); // 左手g.drawLine(70, 50, 90, 100); // 右手g.drawLine(60, 100, 45, 150); // 左腿g.drawLine(70, 100, 85, 150); // 右腿}
}
import java.awt.Color;
import java.awt.Graphics;import javax.swing.JPanel;/*** 身体比较胖的小人*/
public class MyPanel2 extends JPanel{public void paint(Graphics g){super.paint(g);g.setColor(Color.RED);g.drawOval(50, 20, 30, 30); // 头g.drawOval(45, 50, 40, 50); // 身体g.drawLine(50, 50, 30, 100); // 左手g.drawLine(80, 50, 100, 100); // 右手g.drawLine(60, 100, 45, 150); // 左腿g.drawLine(70, 100, 85, 150); // 右腿}
}
客户端
import javax.swing.JFrame;public class Client {public static void main(String[] args) {JFrame jFrame = new JFrame("建造小人");jFrame.setSize(450, 400);jFrame.setLocationRelativeTo(null);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame.add(new MyPanel2());jFrame.setVisible(true);}
}
运行效果
建造小人二——分离
import java.awt.Color;
import java.awt.Graphics;/*** 瘦人的类*/
public class PersonThinBuilder{private Graphics g;private Color color;/*** 初始化时确定画板和颜色*/public PersonThinBuilder(Graphics g,Color color) {this.g = g;this.color = color;}public void build() {g.setColor(this.color);g.drawOval(50, 20, 30, 30); // 头g.drawRect(60, 50, 10, 50); // 身体g.drawLine(60, 50, 40, 100); // 左手g.drawLine(70, 50, 90, 100); // 右手g.drawLine(60, 100, 45, 150); // 左腿g.drawLine(70, 100, 85, 150); // 右腿}
}
import java.awt.Color;
import java.awt.Graphics;/*** 瘦人的类*/
public class PersonFatBuilder {private Graphics g;private Color color;/*** 初始化时确定画板和颜色*/public PersonFatBuilder(Graphics g,Color color) {this.g = g;this.color = color;}public void build() {g.setColor(this.color);g.drawOval(50, 20, 30, 30); // 头g.drawOval(45, 50, 40, 50); // 身体g.drawLine(50, 50, 30, 100); // 左手g.drawLine(80, 50, 100, 100); // 右手g.drawLine(60, 100, 45, 150); // 左腿g.drawLine(70, 100, 85, 150); // 右腿}
}
客户端
import java.awt.Color;
import java.awt.Graphics;import javax.swing.JFrame;
import javax.swing.JPanel;public class Client {public static void main(String[] args) {JFrame jFrame = new JFrame("建造小人");jFrame.setLocationRelativeTo(null);jFrame.setSize(450, 400);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JPanel jPanel = new JPanel() {@Overridepublic void paint(Graphics g) {super.paint(g);
// PersonThinBuilder gThin = new PersonThinBuilder(g, Color.RED);
// gThin.build();PersonFatBuilder gFat = new PersonFatBuilder(g, Color.RED);gFat.build();}};jFrame.add(jPanel);jFrame.setVisible(true);}
}
建造者模式
如果你需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要使用建造者模式,又叫生成器模式。
建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体的建造过程和细节就不需知道了。
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的建造过程可以创建不同的表示。
什么时候使用建造者模式呢?
主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。
产品类
import java.util.ArrayList;
import java.util.List;/*** Product 具体产品*/
public class Product {private List<String> parts = new ArrayList<String>();/*** 添加产品部件*/public void add(String part) {parts.add(part);}/*** 列举所有的产品部件*/public void show() {System.out.println("产品 创建--------");for (String part : parts) {System.out.println(part);}}
}
抽象建造者类
Builder是为创建一个Product对象的各个部件指定的抽象接口。
Builder类——抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法getResult。
public abstract class Builder {public abstract void buildPartA();public abstract void buildPartB();public abstract Product getResult();
}
具体建造者
ConcreteBuilder:具体建造者,实现Builder接口,构造和装配各个部件。
public class ConcreteBuilder1 extends Builder {private Product product = new Product();/*** 建造具体的两个部件,部件A和部件B*/@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();/*** 建造具体的两个部件,部件X和部件Y*/@Overridepublic void buildPartA() {product.add("部件X");}@Overridepublic void buildPartB() {product.add("部件Y");}@Overridepublic Product getResult() {return product;}}
指挥者类
指挥者:是构建一个使用Builder接口的对象。
/*** 用来指挥建造过程*/
public class Director {public void construct(Builder builder) {builder.buildPartA();builder.buildPartB();}
}
客户端
客户端代码,客户不需要知道具体的建造过程。
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();}
}
建造者模式–改进案例
抽象建造人的类
import java.awt.Color;
import java.awt.Graphics;public abstract class PersonBuilder {protected Graphics g;public PersonBuilder(Graphics g,Color color) {this.g = g;this.g.setColor(color);}public abstract void buildHead();public abstract void buildBody();public abstract void buildArmLeft();public abstract void buildArmRight();public abstract void buildLegLeft();public abstract void buildLegRight();
}
建造瘦小人
import java.awt.Color;
import java.awt.Graphics;public class PersonThinBuilder extends PersonBuilder{public PersonThinBuilder(Graphics g,Color color) {super(g,color);}@Overridepublic void buildHead() {g.drawOval(50, 20, 30, 30); // 头}@Overridepublic void buildBody() {g.drawRect(60, 50, 10, 50); // 身体}@Overridepublic void buildArmLeft() {g.drawLine(60, 50, 40, 100); // 左手}@Overridepublic void buildArmRight() {g.drawLine(70, 50, 90, 100); // 右手}@Overridepublic void buildLegLeft() {g.drawLine(60, 100, 45, 150); // 左腿}@Overridepublic void buildLegRight() {g.drawLine(70, 100, 85, 150); // 右腿}
}
建造胖小人
import java.awt.Color;
import java.awt.Graphics;public class PersonFatBuilder extends PersonBuilder{public PersonFatBuilder(Graphics g,Color color) {super(g,color);}@Overridepublic void buildHead() {g.drawOval(50, 20, 30, 30); // 头}@Overridepublic void buildBody() {g.drawOval(45, 50, 40, 50); // 身体}@Overridepublic void buildArmLeft() {g.drawLine(50, 50, 30, 100); // 左手}@Overridepublic void buildArmRight() {g.drawLine(80, 50, 100, 100); // 右手}@Overridepublic void buildLegLeft() {g.drawLine(60, 100, 45, 150); // 左腿}@Overridepublic void buildLegRight() {g.drawLine(70, 100, 85, 150); // 右腿}
}
指挥者
指挥者,用它来控制建造过程,也用它来隔离用户与建造过程的关联。
public class PersonDirector {private PersonBuilder pb;/*** 用户告诉指挥者,我需要什么样的小人*/public PersonDirector(PersonBuilder personBuilder) {this.pb = personBuilder;}/*** 根据用户的选择建造小人*/public void createPerson() {pb.buildHead();pb.buildBody();pb.buildArmLeft();pb.buildArmRight();pb.buildLegLeft();pb.buildLegRight();}
}
客户端
import java.awt.Color;
import java.awt.Graphics;import javax.swing.JFrame;
import javax.swing.JPanel;public class Client {public static void main(String[] args) {JFrame jFrame = new JFrame("建造小人");jFrame.setLocationRelativeTo(null);jFrame.setSize(450, 400);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JPanel jPanel = new JPanel() {@Overridepublic void paint(Graphics g) {super.paint(g);PersonThinBuilder gThin = new PersonThinBuilder(g, Color.BLUE);// 给指挥者中传入具体建造者PersonDirector director = new PersonDirector(gThin);director.createPerson();}};jFrame.add(jPanel);jFrame.setVisible(true);}
}
注:本文内容源自程杰的《大话设计模式》
更多推荐
大话设计模式——建造者模式
发布评论