抽象工厂模式的实践
抽象工厂模式,简单地说,由几个类构成:一个工厂类,一个或多个抽象类作为基类,多个具体类作为子类,还有一个接口。工厂类有一个工厂方法,它接收一个参数,例如要创建对象的信息;返回一个实现了那个接口的对象。该对象的运行时类型则是上述子类中的一个。这些子类中的每一个都继承于那些基类中的一个,那些基类再分别向上继承到一个共同的基类,它是继承关系的根。根类会实现那个接口。
模板方法以Cat和Dog两个类为例,它们可以继承于Pet类,并实现接口IMyPet,然后,工厂类PetFactory的CreatePet方法能这样工作:CreatePet("Kittie") 返回一个新创建的Cat对象,而CreatePet("Woofy") 返回一个Dog对象。它可以是根据数据库里有Kittie和Woofy的记录而去创建这些不同种类的对象的。
现在,我想让这个创建出来的宠物去喝牛奶。不过,为了考验它们,在它们的必经之路上有一个游泳池。猫不会游泳,我特意为它准备了一个竹筏(嗯,我相信她能自己学会怎样使用它)。然后,我分别调用每个宠物的GoToDrinkMilk()方法。该方法类似下面这样:
对于这个表,如果有两条记录,其中一条的PetName是Kittie,PetType是CAT;另一条的PetName是Woofy,PetType是DOG,那么当调用CreatePet("Kittie")时,它会去查询PetName为Kittie的那条记录,然后检查PetType值,发现是CAT后,就创建一个Cat类的对象,并用数据库中的数据去初始化它。基本的工作方式就是这样。
需要注意的是,由于潜在地有些方法需要被“下推”到基类中,基类最好能包含绝大多数它可能用到的数据成员,包括那些在只有在特定的子类中才有的行为。因为这些行为可能被多个子类共享而需要被“下推”到基类中,所以这些行为中要用到的数据成员最好也放在基类中作为受保护(protected)成员来处理。这样会让程序修改的代价更低一些。
总结本文讲述了编程实践中对抽象工厂设计模式的一些常见用法,包括基类与子类、接口、工厂方法及注意事项等。有了这些了解之后,您在将来的实践中或许能更容易地对这种场合进行编程。欢迎在r_mosaic的CSDN博客上提出您的意见和想法。