美文网首页
设计模式学习笔记01-工厂方法模式和抽象工厂模式

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

作者: 百恼神烦 | 来源:发表于2018-06-14 00:29 被阅读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作为基本对象,那么就是抽象工厂,否则是工厂方法。

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

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

    谢谢各位观看。

    相关文章

      网友评论

          本文标题:设计模式学习笔记01-工厂方法模式和抽象工厂模式

          本文链接:https://www.haomeiwen.com/subject/oafeeftx.html