public abstract class AbstractFurniture
implements Cloneable {
public abstract void draw();
// 在Design Pattern上,以下的clone是抽象未實作?br> // 實際上在Java中class都繼承自Object
// 所以在這邊我們直接重新定clone()
// 這是Z(jin)W合Java現行的clone制
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
import java.awt.*;
public class CircleTable extends AbstractFurniture {
protected Point center;
public void setCenter(Point center) {
this.center = center;
}
protected Object clone ()
throws CloneNotSupportedException {
Object o = super.clone();
if(this.center != null) {
((CircleTable) o).center = (Point) center.clone();
}
return o;
}
public void draw() {
System.out.println("\t圓桌\t中心(j)Q?" + center.getX()
+ ", " + center.getY()+ ")");
}
}
import java.awt.*;
public class SquareTable extends AbstractFurniture {
protected Rectangle rectangle;
public void setRectangle(Rectangle rectangle) {
this.rectangle = rectangle;
}
protected Object clone ()
throws CloneNotSupportedException {
Object o = super.clone();
if(this.rectangle != null) {
((SquareTable) o).rectangle = (Rectangle) rectangle.clone();
}
return o;
}
public void draw() {
System.out.print("\tҎ(gu)\t位置Q?" + rectangle.getX()
+ ", " + rectangle.getY()+ ")");
System.out.println(" / 寬高Q?" +
rectangle.getWidth()
+ ", " + rectangle.getHeight()+ ")");
}
}
import java.util.*;
public class House {
private Vector vector;
public House() {
vector = new Vector();
}
public void addFurniture(AbstractFurniture furniture) {
vector.addElement(furniture);
System.out.println("現有家具....");
Enumeration enumeration = vector.elements();
while(enumeration.hasMoreElements()) {
AbstractFurniture f =
(AbstractFurniture) enumeration.nextElement();
f.draw();
}
System.out.println();
}
}
import java.awt.*;
public class Application {
private AbstractFurniture circleTablePrototype;
public void setCircleTablePrototype(
AbstractFurniture circleTablePrototype) {
this.circleTablePrototype = circleTablePrototype;
}
public void runAppExample() throws Exception {
House house = new House();
CircleTable circleTable = null;
// 從工具列選擇一個家具加入房子中
circleTable =
(CircleTable) circleTablePrototype.clone();
circleTable.setCenter(new Point(10, 10));
house.addFurniture(circleTable);
// 從工具列選擇一個家具加入房子中
circleTable =
(CircleTable) circleTablePrototype.clone();
circleTable.setCenter(new Point(20, 30));
house.addFurniture(circleTable);
}
public static void main(String[] args) throws Exception {
Application application = new Application();
application.setCircleTablePrototype(
new CircleTable());
application.runAppExample();
}
}
public class MazeDirector {
private int[][] maze;
private IMazeBuilder mazeBuilder;
public void setMaze(int[][] maze) {
this.maze = maze;
}
public void setMazeBuilder(IMazeBuilder mazeBuilder) {
this.mazeBuilder = mazeBuilder;
}
public void buildMaze() {
for(int i = 0; i < maze.length; i++) {
for(int j = 0; j < maze[i].length; j++) {
// 由於mazeBuilder是IMazeBuilder型態
// 所以無論Builder實例ZQ這邊的程式都無需變動
switch (maze[i][j]) {
case 0:
mazeBuilder.createRoadBlock();
break;
case 1:
mazeBuilder.createWallBlock();
break;
case 2:
mazeBuilder.createTreasureBlock();
break;
default:
System.out.println("undefined");
}
}
mazeBuilder.nextRow();
}
}
}
public interface IMazeBuilder {
public void createRoadBlock();
public void createWallBlock();
public void createTreasureBlock();
public void nextRow();
}
public class SolidMazeBuilder implements IMazeBuilder {
public void createWallBlock() {
System.out.print("?);
}
public void createRoadBlock() {
System.out.print(" ");
}
public void createTreasureBlock() {
System.out.print("$ ");
}
public void nextRow() {
System.out.println();
}
}
public class DiamondMazeBuilder implements IMazeBuilder {
public void createWallBlock() {
System.out.print("?);
}
public void createRoadBlock() {
System.out.print(" ");
}
public void createTreasureBlock() {
System.out.print("* ");
}
public void nextRow() {
System.out.println();
}
}
public class Main {
public static void main(String[] args) {
int[][] maze = {{1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 0, 2, 1},
{1, 0, 1, 0, 1, 0, 1},
{1, 0, 2, 1, 0, 1, 1},
{1, 1, 0, 1, 0, 1, 1},
{1, 0, 0, 2, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1}};
MazeDirector mazeDirector = new MazeDirector();
mazeDirector.setMaze(maze);
System.out.println("Build SolidMaze....");
mazeDirector.setMazeBuilder(new SolidMazeBuilder());
mazeDirector.buildMaze();
System.out.println("Build DiamondMaze....");
mazeDirector.setMazeBuilder(
new DiamondMazeBuilder());
mazeDirector.buildMaze();
}
}
public abstract class AbstractEditor {
private IDocument document;
public abstract IDocument createDocument();
public void newDocument() {
document = createDocument();
document.open();
}
public void saveDocument() {
if(document != null)
document.save();
}
public void closeDocument() {
if(document != null)
document.close();
}
}
public interface IDocument {
public void open();
public void save();
public void close();
}
public class RTFEditor extends AbstractEditor {
public IDocument createDocument() {
return new RTFDocument();
}
}
public class RTFDocument implements IDocument {
public RTFDocument() {
System.out.println("建立RTF文g");
}
public void open() {
System.out.println("開啟文g");
}
public void save() {
System.out.println("儲存文g");
}
public void close() {
System.out.println("關閉文g");
}
}
public class CustomDialog {
private IButton button;
private ITextField textField;
public void setButton(IButton button) {
this.button = button;
}
public void setTextField(ITextField textField) {
this.textField = textField;
}
public void layoutAllComponents() {
// ....
}
public void showDialog() {
this.paintDialog();
button.paintButton();
textField.paintTextField();
}
public void paintDialog() {
System.out.println("custom dialog paints....");
}
}
public class CustomDialog {
private IButton button;
private ITextField textField;
public CustomDialog(IWidgetFactory widgetFactory) {
setWidgetFactory(widgetFactory);
}
// 由於客戶端只依賴於抽象的工廠Q工廠如何實作並無關客戶端的?br> // 要抽換工廠並不需要改動客戶端的程?br> public void setWidgetFactory(IWidgetFactory widgetFactory) {
setButton(widgetFactory.getButton());
setTextField(widgetFactory.getTextField());
}
public void layoutAllComponents() {
// layout all components
}
// 這邊也是依賴抽象Q實際改變了(jin)元g實例
// 客戶端代g不用更改
public void setButton(IButton button) {
this.button = button;
}
public void setTextField(ITextField textField) {
this.textField = textField;
}
public void showDialog() {
this.paintDialog();
button.paintButton();
textField.paintTextField();
}
public void paintDialog() {
System.out.println("custom dialog paints....");
}
}
public interface IButton {
public void paintButton();
}
public interface ITextField {
public void paintTextField();
}
public interface IWidgetFactory {
public IButton getButton();
public ITextField getTextField();
}
public class MacButton implements IButton {
public void paintButton() {
System.out.println("Mac button paints....");
}
}
public class WindowsButton implements IButton {
public void paintButton() {
System.out.println("Windows button paints....");
}
}
public class MacTextField implements ITextField {
public void paintTextField() {
System.out.println("Mac textField paints....");
}
}
public class WindowsTextField implements ITextField {
public void paintTextField() {
System.out.println("Windows textField paints....");
}
}
public class MacWidgetFactory implements IWidgetFactory {
public IButton getButton() {
return new MacButton();
}
public ITextField getTextField() {
return new MacTextField();
}
}
public class WindowsWidgetFactory
implements IWidgetFactory {
public IButton getButton() {
return new WindowsButton();
}
public ITextField getTextField() {
return new WindowsTextField();
}
}
public interface IMusicBox {
public void play();
}
public class PianoBox implements IMusicBox {
public void play() {
System.out.println("撥放鋼琴x(chng):)");
}
}
public class ViolinBox implements IMusicBox {
public void play() {
System.out.println("撥放提琴音樂^_^");
}
}
public class MusicBoxFactory {
public static IMusicBox createMusicBox(String name)
throws InstantiationException,
IllegalAccessException,
ClassNotFoundException {
// 這邊使用的是Java的Reflection制來產生實?br> // 不過客戶端不用管?br> // 以後q改變?jin)這邊的程式,客戶端程式是不用更改?br> return (IMusicBox) Class.forName(name).newInstance();
}
}
public class MusicBoxDemo {
public static void main(String[] args) throws Exception {
playMusicBox(MusicBoxFactory.createMusicBox("PianoBox"));
playMusicBox(MusicBoxFactory.createMusicBox("ViolinBox"));
}
public static void playMusicBox(IMusicBox musicBox) {
musicBox.play();
}
}