每日设计模式——工厂方法模式

来源:互联网 发布:蒋欣 长相 知乎 编辑:程序博客网 时间:2024/06/05 22:43

      工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。(语出自《大话设计模式》)简单工厂模式因为再添加新内容时要对工厂类进行修改,故而不符合开放-封闭原则,而工厂类将选择延迟到客户端,在添加新内容时只要增加相应的产品和工厂即可,故而符合开放-封闭原则的。

      《大话设计模式》里举得工厂方法模式的例子是数学运算,和学雷锋做好事的例子,其中雷锋可以当做产品接口,而各种学雷锋的不同的人就是具体实现的产品。另外要设置一个雷锋工厂的接口,对应各种学雷锋的人去实现相应的工厂的接口。在客户端调用时,客户只要选择配套的工厂就可以对相应的产品的操作。

      Gof的设计模式说了,当一个类不知道它所必须创建的对象的类的时候使用工厂方法模式。我就在想,那么古剑里什么地方用工厂方法模式解释起来能比较合理?我觉得也许遇怪的时候用这个实现可能比较有道理。在遇怪之前,我们并不知道会遇到什么样类型的怪物(尤其是那种踩地雷方式的游戏),怪物有几个。迷宫里遇到个怪物后,进入战斗中的怪物的数量和类型应当是随机的,这很符合本段开头那句话,我们只知道我们将要跟几个怪物对象战斗,但我们在进入战斗之前并不知道要跟什么样类型的怪物战斗。所以游戏中可以用一个或几个随机数来判断选择本次战斗中应调用的怪物工厂来构建怪物对象。

 

具体实现如下,比较长,所以只取一个产品示例,如果有新的产品,那就加新的工厂就可以。

product.h 文件

 

creator.h 文件

 

 

concreteProduct1.h 文件

 

concreteProduct1.cpp 文件

 

concreteCreator1.h 文件

 

concreteCreator1.cpp 文件

 

main.cpp 文件

 

运行结果

 

另外讲声sorry,之前由于我的失误,在前两节的设计模式中把concrete写成了concreate,虽然今天彻底检查了一遍改了一遍,难免还有错漏的地方,如果对谁造成了误导请原谅。

原创粉丝点击