参考文档:
1.设计模式-可复用面向对象软件的基础
2.http://blog.csdn.net/hguisu/article/details/7505909(设计模式(一)工厂模式Factory(创建型))
工厂方法模式(Factory Method)(对象创建型模式)
理论方面的知识,可以参考 参考文档。。。
我们来看一下factory method 的结构:
代码实现:
案例是书中建造迷宫的例子。
MazeGame.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class MazeGame { public Maze createMaze() { Maze aMaze = new Maze(); Room r1 = makeRoom(1); Room r2 = makeRoom(2); Door theDoor = makeDoor(r1, r2); aMaze.addRoom(r1); aMaze.addRoom(r2); r1.setSide(Room.Side.North, makeWall()); r1.setSide(Room.Side.East, theDoor); r1.setSide(Room.Side.South, makeWall()); r1.setSide(Room.Side.West, makeWall()); r2.setSide(Room.Side.North, makeWall()); r2.setSide(Room.Side.East, makeWall()); r2.setSide(Room.Side.South, makeWall()); r2.setSide(Room.Side.West, theDoor); return aMaze; } public Maze makeMaze() { return new Maze(); } public Room makeRoom(int n) { return new Room(n); } public Wall makeWall() { return new Wall(); } public Door makeDoor(Room r1, Room r2) { return new Door(r1, r2); } }
BombedMazeGame.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class BombedMazeGame extends MazeGame { @Override public Wall makeWall() { return new BombedWall(); } @Override public Room makeRoom(int n) { return new RoomWithABomb(n); } }
EnchantedMazeGame.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class EnchantedMazeGame extends MazeGame { private Spell castSpell() { return new Spell(); } @Override public Room makeRoom(int n) { return new EnchantedRoom(n, castSpell()); } @Override public Door makeDoor(Room r1, Room r2) { return new DoorNeedingSpell(r1, r2); } }
Client.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class Client { public static void main(String[] args) { Maze maze = new MazeGame().createMaze(); Maze maze1 = new BombedMazeGame().createMaze(); Maze maze2 = new EnchantedMazeGame().createMaze(); } }
上面的MazeGame 工厂方法的父类,对应的BombedMazeGame 和EnchantedMazeGame 为子类。还有Client测试类。
下面的一些是Product类:
Maze.java:
package com.rick.designpattern.factory_method;
import java.util.ArrayList;
import java.util.List;
/**
* 迷宫
* <p>
* Created by MyPC on 2017/6/21.
*/
public class Maze {
private List<Room> rooms = new ArrayList<Room>();
public void addRoom(Room room) {
rooms.add(room);
}
}
Room.java:
package com.rick.designpattern.factory_method;
import java.util.HashMap;
import java.util.Map;
/**
* Created by MyPC on 2017/6/21.
*/
public class Room {
private int n;
private Map<Side, Object> walls = new HashMap<Side, Object>();
public Room(int n) {
this.n = n;
}
public void setSide(Side side, Object o) {
walls.put(side, o);
}
public enum Side {
North, East, South, West;
}
}
Door.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class Door { private Room r1, r2; public Door(Room r1, Room r2) { this.r1 = r1; this.r2 = r2; } }
Wall.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class Wall { }
BombedWall.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class BombedWall extends Wall { }
DoorNeedingSpell.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class DoorNeedingSpell extends Door { public DoorNeedingSpell(Room r1, Room r2) { super(r1, r2); } }
EnchantedRoom.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class EnchantedRoom extends Room { private Spell spell; public EnchantedRoom(int n, Spell spell) { super(n); this.spell = spell; } }
RoomWithABomb.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class RoomWithABomb extends Room { public RoomWithABomb(int n) { super(n); } }
Spell.java:
package com.rick.designpattern.factory_method; /** * Created by MyPC on 2017/6/21. */ public class Spell { }