建造者模式
一、建造小人一
package operation;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class PersonThinBuilder extends Frame{
/**
*
*/
private static final long serialVersionUID = 1L;
public void paint(Graphics g) {
Color c=g.getColor();
g.setColor(Color.BLACK);
g.fillOval(50,50,30,30);//头
g.fillRect(60,80,10,50);//身体
g.drawLine(60,80,40,130);//左手
g.drawLine(70,80,90,130);//右手
g.drawLine(60,130,45,180);//左腿
g.drawLine(70,130,85,180);//右腿
g.setColor(c);
}
public void lauchFrame() {
this.setLocation(400,300);
this.setSize(800,600);
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{System.exit(0);}
});
this.setBackground(Color.WHITE);
setVisible(true);
} }
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
PersonThinBuilder person=new PersonThinBuilder();
person.lauchFrame();
}
}
二、建造小人二
package operation;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class PersonThinBuilder extends Frame{
/**
*
*/
private static final long serialVersionUID = 1L;
public void paint(Graphics g) {
Color c=g.getColor();
g.setColor(Color.BLACK);
g.fillOval(50,50,30,30);//头
g.fillRect(60,80,10,50);//身体
g.drawLine(60,80,40,130);//左手
g.drawLine(70,80,90,130);//右手
g.drawLine(60,130,45,180);//左腿
g.drawLine(70,130,85,180);//右腿
g.setColor(c);
}}
class PersonFatBuilder{
private Graphics g;
public PersonFatBuilder(Graphics g)
{
this.g=g;
}
public void build()
{
Color c=g.getColor();
g.setColor(Color.BLACK);
g.fillOval(50, 50, 30, 30);//头
g.fillOval(45, 80, 40, 50);//身体
g.drawLine(60, 80, 40, 130);//左手
g.drawLine(70, 80, 90, 130);//右手
g.drawLine(60, 130, 45, 180);//左腿
g.drawLine(70, 130, 85, 180);//右腿
g.setColor(c);
}
}
class DrawPerson extends Frame{
public void paint(Graphics g) {
PersonFatBuilder p=new PersonFatBuilder(g);
p.build();
}
public void lauchFrame() {
this.setLocation(400,300);
this.setSize(800, 600);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setBackground(Color.WHITE);
setVisible(true);
}
}
public class Main{
public static void main(String[] args){
DrawPerson drawperson=new DrawPerson();
drawperson.lauchFrame();
}
}
三、建造者模式
这里建造小人的过程都是稳定的,都需要头身手脚,而具体建造的细节是不同的,有胖有瘦有高有矮。将一个复杂对象的构建与它的表示分离,使得同样的建构过程可以创建不同的表示意图是,我们需要应用于建造者模式。建造者模式就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
先定义一个抽象的建造人的类。
package operation;
import java.awt.*;
import java.awt.event.*;
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();
}
class PersonThinBuilder extends PersonBuilder{
public PersonThinBuilder(Graphics g)
{
super(g);
}
@Override
public void buildHead() {
// TODO Auto-generated method stub
g.fillOval(50, 50, 30, 30);//头
}
@Override
public void buildBody() {
// TODO Auto-generated method stub
g.fillRect(60, 80, 10, 50);//身体
}
@Override
public void buildArmLeft() {
// TODO Auto-generated method stub
g.drawLine(60, 80, 40, 130);//左手 四个数确定两个点
}
@Override
public void buildArmRight() {
// TODO Auto-generated method stub
g.drawLine(70, 80, 90, 130);//右手
}
@Override
public void buildLegLeft() {
// TODO Auto-generated method stub
g.drawLine(60, 130, 45, 180);//左腿
}
@Override
public void buildLegRight() {
// TODO Auto-generated method stub
g.drawLine(70, 130, 85, 180);//右腿
}
}
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();
}
}
class DrawPerson extends Frame{
public void paint(Graphics g) {
Color c=g.getColor();
g.setColor(Color.BLACK);
PersonThinBuilder p=new PersonThinBuilder(g);
PersonDirector pdThin=new PersonDirector(p);
pdThin.createPerson();
g.setColor(c);
}
public void lauchFrame() {
this.setLocation(400,300);
this.setSize(800, 600);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setBackground(Color.WHITE);
setVisible(true);
}
}
public class Main{
public static void main(String[] args){
DrawPerson drawperson=new DrawPerson();
drawperson.lauchFrame();
}
}
四、建造者模式基本代码
package operation;
import java.util.ArrayList;
import java.util.List;
class Product{
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);
}
}
}
abstract class Builder{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
class ConcreteBuilder1 extends Builder{
private Product product=new Product();
@Override
public void BuildPartA() {
// TODO Auto-generated method stub
product.Add("部件A");
}
@Override
public void BuildPartB() {
// TODO Auto-generated method stub
product.Add("部件B");
}
@Override
public Product GetResult() {
// TODO Auto-generated method stub
return product;
}
}
class ConcreteBuilder2 extends Builder{
private Product product=new Product();
@Override
public void BuildPartA() {
// TODO Auto-generated method stub
product.Add("部件X");
}
@Override
public void BuildPartB() {
// TODO Auto-generated method stub
product.Add("部件Y");
}
@Override
public Product GetResult() {
// TODO Auto-generated method stub
return product;
}
}
class Director{
public void Construct(Builder builder) {
builder.BuildPartA();
builder.BuildPartB();
}
}
public class Main{
public static void main(String[] args){
Director director=new Director();
Builder b1=new ConcreteBuilder1();
Builder b2=new ConcreteBuilder2();
director.Construct(b1);
Product p1=b1.GetResult();
p1.Show();
director.Construct(b2);
Product p2=b2.GetResult();
p2.Show();
}
}