分析工厂模式中的问题并改造

642 阅读6分钟

工厂模式基本与简单工厂模式差不多,上面也说了,每次添加一个产品子类都必须在工厂类中添加一个判断分支,这样违背了开放-封闭原则,因此,工厂模式就是为了解决这个问题而产生的。

既然每次都要判断,那就把这些判断都生成一个工厂子类,这样,每次添加产品子类的时候,只需再添加一个工厂子类就可以了。这样就完美的遵循了开放-封闭原则。但这其实也有问题,如果产品数量足够多,要维护的量就会增加,好在一般工厂子类只用来生成产品类,只要产品子类的名称不发生变化,那么基本工厂子类就不需要修改,每次只需要修改产品子类就可以了。

同样工厂模式一般应该于程序中大部分地方都只使用其中一种产品,工厂类也不用频繁创建产品类的情况。这样修改的时候只需要修改有限的几个地方即可。

简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但客户端看到的只是产品的抽象对象,无需关心到底是返回了哪个子类。客户端唯一需要知道的具体子类就是工厂子类。除了这点,基本是达到了依赖倒转原则的要求。

所以简单工厂模式一般应该于程序中大部分地方都只使用其中一种产品,工厂类也不用频繁创建产品类的情况。这样修改的时候只需要修改有限的几个地方即可。

优点: 1.隐藏了对象创建的细节,将产品的实例化推迟到子类中实现。 2.客户端基本不用关心使用的是哪个产品,只需要知道用哪个工厂就行了,提供的类型也可以用比较便于识别的字符串。 3.方便添加新的产品子类,每次只需要修改工厂类传递的类型值就行了。 4.遵循了依赖倒转原则。

缺点: 1.要求产品子类的类型差不多,使用的方法名都相同,如果类比较多,而所有的类又必须要添加一种方法,则会是非常麻烦的事情。或者是一种类另一种类有几种方法不相同,客户端无法知道是哪一个产品子类,也就无法调用这几个不相同的方法。 2.每添加一个产品子类,都必须在工厂类中添加一个判断分支,这违背了开放-封闭原则。

1.抽象工厂模式

比工厂模式更为复杂,就像上面提到的缺点一样,工厂模式和简单工厂模式要求产品子类必须要是同一类型的,拥有共同的方法,这就限制了产品子类的扩展。于是为了更加方便的扩展,抽象工厂模式就将同一类的产品子类归为一类,让他们继承同一个抽象子类,我们可以把他们一起视作一组,然后好几组产品构成一族。

此时,客户端要使用时必须知道是哪一个工厂并且是哪一组的产品抽象类。每一个工厂子类负责产生一族产品,而子类的一种方法产生一种类型的产品。在客户端看来只有AbstractProductA和AbstractProductB两种产品,使用的时候也是直接使用这两种产品。而通过工厂来识别是属于哪一族产品

2.工厂方法模式

抽象工厂模式就变得比工厂模式更为复杂,就像上面提到的缺点一样,工厂模式和简单工厂模式要求产品子类必须要是同一类型的,拥有共同的方法,这就限制了产品子类的扩展。于是为了更加方便的扩展,抽象工厂模式就将同一类的产品子类归为一类,让他们继承同一个抽象子类,我们可以把他们一起视作一组,然后好几组产品构成一族。

此时,客户端要使用时必须知道是哪一个工厂并且是哪一组的产品抽象类。每一个工厂子类负责产生一族产品,而子类的一种方法产生一种类型的产品。在客户端看来只有AbstractProductA

和AbstractProductB两种产品,使用的时候也是直接使用这两种产品。而通过工厂来识别是属于哪一族产品 工厂方法模式中抽象工厂类负责创建对象的接口,具体对象的创建工作的工厂由实现工厂接口的具体类来完成。

    public interface Factory {
        public abstract Animal createAnimal();
    }
    public abstract class Animal {
        public abstract void eat();
    }
    public class CatFactory implements Factory {
    public Animal createAnimal() {
        return new Cat();
        }
    }
    public class Dog extends Animal {
        public void eat() {
        }
    }
    public static void main(String[] args) {
        Factory f = new DogFactory();
        f.createAnimal().eat();
        f = new CatFactory();
        f.createAnimal().eat();
    }

回顾下简单工厂模式的主要内容:简单工厂模式就是实质就是专门定义了一个工厂类,利用工厂类的静态方法来根据用户需求创建对象,优点是客户端的压力较小,客户端不需要做创建实例的操作,只需要调用工厂类中的方法就可以获得对应实例,而其缺点也非常明显,其所有创建工作都在一个工厂类完成,耦合性较高,而且当系统需要增加或者修改产品时需要改动工厂类,既不符合单一职责的原则也不符合开放-关闭原则,所以就出现了工厂模式。

工厂模式是对简单工厂模式的进一步抽象化,是简答工厂模式的衍生,根据设计模式的基本原则也是设计模式的精髓“封装变化点”,即哪里发生改变就把哪里封装起来,所以工厂模式对简单工厂中的工厂类做了一个封装,使其满足单一职责和开放-关闭原则。 创建对象的三种方式

【解决问题】:简单工厂模式中违背了单一职责和开放-关闭原则。 【核心思想】:建立一个抽象工厂的基类,给每个产品建立一个工厂,该工厂继承之抽象工厂,规定每个产品都有特定的工厂来创建。 【角色】 抽象工厂角色:这是工厂模式的核心,它与应用程序无关,是具体工厂必须继承的父类或者必须实现的接口 具体工厂角色:包含逻辑业务的代码,由应用程序调用以创建对应的具体产品对象 抽象产品角色:具体产品必须继承的父类或者必须实现的接口具体产品角色:所创建的对象就是此角色的实例。

-END-