建造者模式
案例:建造小人一
源代码:
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();
}
}
抽象一个小人类,用户可以根据选择调用不同的建造方法。