场景:画不同的人。
我看教程中建造者是一个接口,而我这个例子中,建造者使用了抽象类,因为要实现JPanel,然后是两个子类建造者,再设计一个指挥者类,本来应该在指挥者类中组装建造者的方法,但是由于技术原因,我这只能在子类建造者的paint方法中组装建造者了。最后是客户端主类。
建造者抽象类:
package com.freshbin.pattern.builder.myexample.person;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
/**
* 小人建造接口
*
* @author freshbin
* @date 2019年1月13日 上午11:01:47
*/
public abstract class PersonBuilder extends JPanel {
protected Graphics graphics;
abstract void builderHead();
abstract void builderBody();
abstract void builderArmLeft();
abstract void builderArmRight();
abstract void builderLegLeft();
abstract void builderLegRight();
}
建造者子类:
package com.freshbin.pattern.builder.myexample.person;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
/**
* 瘦小人
*
* @author freshbin
* @date 2019年1月13日 上午11:04:43
*/
public class ThinPersonBuilder extends PersonBuilder {
@Override
public void builderHead() {
graphics.drawOval(50, 20, 30, 30);
}
@Override
public void builderBody() {
graphics.drawRect(60, 50, 10, 50);
}
@Override
public void builderArmLeft() {
graphics.drawLine(60, 50, 40, 100);
}
@Override
public void builderArmRight() {
graphics.drawLine(70, 50, 90, 100);
}
@Override
public void builderLegLeft() {
graphics.drawLine(60, 100, 45, 150);
}
@Override
public void builderLegRight() {
graphics.drawLine(70, 100, 85, 150);
}
@Override
public void paint(Graphics graphics) {
super.paint(graphics);
this.graphics = graphics;
builderHead();
builderBody();
builderArmLeft();
builderArmRight();
builderLegLeft();
builderLegRight();
}
}
package com.freshbin.pattern.builder.myexample.person;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
/**
* 胖小人
*
* @author freshbin
* @date 2019-1-13 15:26:37
*/
public class FatPersonBuilder extends PersonBuilder {
@Override
public void builderHead() {
graphics.drawOval(50, 20, 30, 30);
}
@Override
public void builderBody() {
graphics.drawRect(50, 50, 30, 50);
}
@Override
public void builderArmLeft() {
graphics.drawLine(50, 50, 40, 100);
}
@Override
public void builderArmRight() {
graphics.drawLine(80, 50, 90, 100);
}
@Override
public void builderLegLeft() {
graphics.drawLine(50, 100, 45, 150);
}
@Override
public void builderLegRight() {
graphics.drawLine(80, 100, 85, 150);
}
@Override
public void paint(Graphics graphics) {
super.paint(graphics);
this.graphics = graphics;
builderHead();
builderBody();
builderArmLeft();
builderArmRight();
builderLegLeft();
builderLegRight();
}
}
指挥者:
package com.freshbin.pattern.builder.myexample.person;
import java.awt.Graphics;
import javax.swing.JFrame;
/**
* 建造小人指挥者
*
* @author freshbin
* @date 2019年1月13日 上午11:12:58
*/
public class PersonDirector extends JFrame {
private PersonBuilder personBuilder;
public PersonDirector(PersonBuilder personBuilder, Integer width, Integer hight) {
this.personBuilder = personBuilder;
this.add(personBuilder);
this.setSize(width, hight);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void builderPerson() {
/*personBuilder.builderHead();
personBuilder.builderBody();
personBuilder.builderArmLeft();
personBuilder.builderArmRight();
personBuilder.builderLegLeft();
personBuilder.builderLegRight();*/
}
}
客户端主类:
package com.freshbin.pattern.builder.myexample;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import com.freshbin.pattern.builder.myexample.person.FatPersonBuilder;
import com.freshbin.pattern.builder.myexample.person.PersonBuilder;
import com.freshbin.pattern.builder.myexample.person.PersonDirector;
import com.freshbin.pattern.builder.myexample.person.ThinPersonBuilder;
/**
* 建造者模式
*
* @author freshbin
* @date 2019年1月13日 上午10:53:06
*/
public class BuilderPatternDemo {
public static void main(String[] args) {
int width=480;
int hight=720;
PersonBuilder thinPersonBuilder = new ThinPersonBuilder();
PersonDirector personDirector = new PersonDirector(thinPersonBuilder, width, hight);
PersonBuilder fatPersonBuilder = new FatPersonBuilder();
personDirector = new PersonDirector(fatPersonBuilder, width, hight);
}
}
效果图: