两书是否涉及?
大话设计为第8章内容,而在设计模式一书中为3.3内容
书中例子
再现活雷锋
创建迷宫
在简单工厂上的改进:
工厂类:
//使用接口实现抽象工厂
interface IFactory {
LeiFeng CreateLeiFeng();
}
//具体的工厂
class UndergraduateFactory : IFactory {
public LeiFeng CreateLeiFeng() {
return new Undergraduate();
}
}
class VolunteerFactory : IFactory {
public LeiFeng CreateLeiFeng() {
return new Volunteer();
}
}
雷锋类:
//父类
class LeiFeng {
public void Sweep()
{
Console.WriteLine("扫地");
}
}
//派生类
class Undergraduate : LeiFeng{}
class Volunteer : LeiFeng { }
客户端的实现:
class Program{
static void Main(string[] args){
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLeiFeng();
student.Sweep();
IFactory factory2 = new VolunteerFactory();
LeiFeng voluteer = factory2.CreateLeiFeng();
voluteer.Sweep();
}
}
说明:比如要添加白领类,只需要添加白领类和创建它的工厂类就可以,不再需要修改原本工厂类里的方法(等于是把简单工厂类中的switch…case去掉了,在实例化时,通过子类来决定实例化哪一个类),克服了简单工厂违背开放-封闭原则,又保持了封装对象创建过程的优点。
缺点:为了创建一个特定的对象,需要添加两个类
设计模式一书中对工厂方法意图的定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
以迷宫为例:
抽象工厂可以是Maze类,其中的方法CreateMaze构造一个房屋
需要组合的类有:Door类、Room类和Wall类
扩展一个有炸弹的迷宫:BombedMaze类:Maze类
需要组合的类有:BombedWall类:Wall类、RoomWithABomb类:Room类
扩展一个有秘法的迷宫:EnchantedMaze类:Maze类
需要组合的类有:EnchantedRoom类:Room类、DoorNeedingSpell类:Door类