对象创建模式(Builder)
案例-建造“小人”
import java.util.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.*;
class main extends Frame
{
public void paint(Graphics g)
{
Color c=g.getColor();
g.setColor(Color.BLACK);
g.fillOval(50, 50, 50, 50);
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.addWindowFocusListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
this.setBackground(Color.WHITE);
setVisible(true);
}
public static void main(String[] args) {
main person=new main();
person.lauchFrame();
}
}
建造小人二,分别建两个类一个瘦人的类一个胖人的类。
class personThin
{
private Graphics g;
public personThin(Graphics g)
{
this.g=g;
}
public void build()
{
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 personFat
{
private Graphics g;
public personFat(Graphics g)
{
this.g=g;
}
public void build()
{
Color c=g.getColor();
g.setColor(Color.BLACK);
g.fillOval(50, 50, 30, 30);
g.fillRect(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 main extends Frame
{
public void paint(Graphics g)
{
personFat p=new personFat(g);
p.build();
}
public void lauchFrame()
{
this.setLocation(400, 300);
this.setSize(800, 600);
this.addWindowFocusListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
this.setBackground(Color.WHITE);
setVisible(true);
}
public static void main(String[] args) {
main person=new main();
person.lauchFrame();
}
}
规范化:规定凡是小人,都有头,手,胳膊,脚。
所以要定义一个抽象类
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 personThin extends PersonBuilder
{
public personThin(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 personFat extends PersonBuilder
{
public personFat(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(45, 80, 40, 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 creatPerson()
{
pb.buildhead();
pb.buildbody();
pb.buildArmleft();
pb.buildArmRight();
pb.buildLegleft();
pb.buildLegRight();
}
}
class main extends Frame
{
public void paint(Graphics g)
{
Color c=g.getColor();
g.setColor(Color.BLACK);
personThin p=new personThin(g);
PersonDirector PdThin=new PersonDirector(p);//用户通过调用PersonDirector类就可以根据选择建造小人
PdThin.creatPerson();//而建造的过程通过creatPerson()制定好了。
g.setColor(c);
}
public void lauchFrame()
{
this.setLocation(400, 300);
this.setSize(800, 600);
this.addWindowFocusListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
this.setBackground(Color.WHITE);
setVisible(true);
}
public static void main(String[] args) {
main person=new main();
person.lauchFrame();
}
}
抽象一个小人类,用户可以根据选择调用不同的建造方法
建造者模式
- 如果需要将一个复杂对象的构建与它表示分离,使得同样的构建过程可以创建不同的表示时,需要应用建造者模式,又叫生成器模式。
- 建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 用了建造者模式,用户就不需要知道具体建造的过程和细节,只需要指定需要建造的类型就可以得到它们。