前面学习了简单工厂模式,理解的不是很深刻,今天刚好看到了工厂方法模式,比较一下也加深对前面的理解。
首先无论是简单工厂模式还是工厂方法模式都是把不变的地方提取出来,把容易发生变化的封装起来。以达到做大程度的复用,和适应用户的变动,以及项目的扩展。
简单工厂模式
理解
又称为静态工厂模式,它专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有相通的父类。由工厂类根据传入的参数动态决定应该创建哪一个产品类的实例。它包含必要的判断逻辑,能根据外界给定的信息,决定应该穿件那个具体类的对象。简单工厂模式可以理解为父亲给儿子留了一笔钱,规定这笔钱可以用于上学、买房或者买车,然后让儿子自己选择用于哪一个。
优点
工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个类的实例,客户端可以避免直接创建对象。这样就可以实现对责任的分割,降低耦合性,明确了具体的职责和权力,有利于整个系统的优化。
缺点
当产品具有比较复杂的多层结构时,它的工厂类只有一个,这时候再以不变应万变就成为它最大的缺点了。因为工厂类是整个组织的核心,它聚集了所有产品的创建逻辑,一旦工厂不能正常工作,整个系统都会受到影响,可扩展性较差。扩展性差一旦有新的需求,就不得不修改工厂逻辑,这样就会导致工厂逻辑过为复杂,违背了开——闭原则。同时静态工厂方法不利于形成基于继承的等级结构。
工厂方法模式
理解
它是一个粒度很小的设计模式,因为模式的表现只是一个抽象的方法。工厂方法模式定义了一个用于创建对象的接口,让子类决定具体实例化哪一个类。也就是在工厂和产品之间增加接口,工厂不再负责产品的实现,有借口针对不同条件返回不同的类实例,再由具体类实例去实现。工厂方法时简单工厂的衍生,改进了许多简单工厂的缺点,遵循了开——闭原则,实现了可扩展,可以用于更为复杂的产品结果场合。工厂方法可以理解为同样是父亲给儿子留了一笔钱,然后直接让儿子去支配,怎么花父亲一律不管。
优点
工厂方法模式客服了简单工厂的很多缺点,它每个具体工厂只完成单一任务,而且遵循开——闭原则,代码简洁而且具有良好的扩展性。
缺点
如果有产品类需要修改,对应的工厂类也需要进行修改。一旦有多个产品类都需要修改的时候,对号入座的问题就出现了,这是对工厂类的修改就会变得相当复杂。因此工厂方法模式虽然有利于扩展但是不利于维护。
综上所述,我们就可以知道针对不同的情况具体采用哪种模式对编程更有利了。当需要创建的对象比较少,客户只知道传入工厂的参数,并不关心如何创建对象的时候就可以采用简单工厂模式;当类将创建对象的职责委托给多个帮助子类中的某一个时就可以采用工厂方法模式了。