工厂方法模式(Factory Method)(对象创建型模式)

参考文档:

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 {
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值