设计模式学习笔记01-工厂方法模式和抽象工厂模式

2018-06-14  本文已影响0人  百恼神烦

本文主要是看了《设计模式》做的笔记和思考,在此分享仅代表个人观点,如有不对的地方欢迎批评和指正。

工厂方法模式

当有多个相似且可在逻辑上归类的对象时,可以使用工厂方法模式进行创建,有两种使用套路。

套路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作为基本对象,那么就是抽象工厂,否则是工厂方法。

另外,抽象工厂在创建产品时,“最通常的一个办法是为每一个产品定义一个工厂方法。一个具体的工厂将为每个产品重定义该工厂方法以指定产品”。

因此我也可以更加确定我一开始的思路:“工厂方法”类似于描述技师与其商品之间的关系;而“抽象工厂”是描述一家公司中有哪些技师岗位,至于技师到底生产了什么,要进一步实例化才行。

谢谢各位观看。

上一篇下一篇

猜你喜欢

热点阅读