本文主要是看了《设计模式》做的笔记和思考,在此分享仅代表个人观点,如有不对的地方欢迎批评和指正。
工厂方法模式
当有多个相似且可在逻辑上归类的对象时,可以使用工厂方法模式进行创建,有两种使用套路。
套路1:
向工厂方法传入标识符,使其参数化,譬如下面这段代码:
Ball produce(String flag){
switch(flag){
case "篮球": return new Basketball();break;
case "足球": return new Football();break;
}
}
这种使用方法简单易懂,但如果要产生新的Ball子类,需要改写这个switch语句。
套路2:
继承有工厂方法的类,并重写它,例如:
Factory{
Ball produce(){};
}
BasketballFactory extends Factory{
Ball produce(){
return new Basketball();
}
}
Ball basketBall = (new BasketballFactory()).produce;
这个理解起来存在困难,而且已经跟抽象工厂很像了,好处是扩展时不会修改原来的类。根据《设计模式》上的例子,我推测,这样使用工厂方法模式是主要维持一对一的关系,即通常一个工厂对应一个产品。
抽象工厂模式
为了方便创建多个有共同点的对象而有了工厂方法,而为了创建多个有共同点的工厂则有了抽象工厂,这是我仔细对比了书中两者的UML类图的感想。抽象工厂倾向于帮助确定一个系列的对象的创建过程,例子如下:
abstract SchoolFactory{
Student getStudent();
Teacher getTeacher();
}
PrimarySchoolFactory extends SchoolFactory{
Student getStudent(){
return new PrimaryStudent();
}
Teacher getTeacher(){
return new PrimaryTeacher();
}
}
goToSchool(SchoolFactory factory){
Student s = factory.getStudent();
Teacher t = factory.getTeacher();
}
goToSchool(new PrimarySchoolFactory);
总结
抽象工厂模式是工厂方法模式的进一步抽象,现实使用中其实分不清楚也不影响使用,真要弄个明白,可以看工厂调用情况,如果调用的时候是以AbstractFactory作为基本对象,那么就是抽象工厂,否则是工厂方法。
另外,抽象工厂在创建产品时,“最通常的一个办法是为每一个产品定义一个工厂方法。一个具体的工厂将为每个产品重定义该工厂方法以指定产品”。
因此我也可以更加确定我一开始的思路:“工厂方法”类似于描述技师与其商品之间的关系;而“抽象工厂”是描述一家公司中有哪些技师岗位,至于技师到底生产了什么,要进一步实例化才行。
谢谢各位观看。
网友评论