1.工厂模式
1.1简单工厂模式
定义:定义了一个创建对象的类,由这个类来封装实例化对象的行为。
举例:(我们举一个pizza工厂的例子)
pizza工厂一共生产三种类型的pizza:chesse,pepper,greak。通过工厂类(SimplePizzaFactory)实例化这三种类型的对象。类图如下:
工厂类的代码如下:
简单工厂存在的问题与解决方法: 简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了开闭原则,所以,从设计角度考虑,有一定的问题,如何解决?我们可以定义一个创建对象的抽象方法并创建多个不同的工厂类实现该抽象方法,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。这种方法也就是我们接下来要说的工厂方法模式。
大白话:简单工厂模式就是我们定义了一个可以创建对象的类,通过这个类可以实例化对象,但是创建类的时候需要依赖我们的这个工厂类,当我们想要拓展程序也就是说修改功能的时候就必须对工厂类进行修改,违背了我们开背原则,所以我们要引入接下来的工厂方法模式,我们定义一个创建对象的抽象方法,让我们不同的工厂类可以来实现这个接口,当我们想要加功能的时候,可以创建新的工厂类就可以了,不需要修改原来的工厂类。
1.2 工厂方法模式
定义:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
举例:(我们依然举pizza工厂的例子,不过这个例子中,pizza产地有两个:伦敦和纽约)。添加了一个新的产地,如果用简单工厂模式的的话,我们要去修改工厂代码,并且会增加一堆的if else语句。而工厂方法模式克服了简单工厂要修改代码的缺点,它会直接创建两个工厂,纽约工厂和伦敦工厂。类图如下:
OrderPizza中有个抽象的方法:
两个工厂类继承OrderPizza并实现抽象方法:
通过不同的工厂会得到不同的实例化的对象,PizzaStroe的代码如下:
解决了简单工厂模式的问题:增加一个新的pizza产地(北京),只要增加一个BJOrderPizza类实现抽象方法就可以:
工厂方法模式的好处就是:我如果想增加功能只需要多写一个实现类就可以了,不需要改动原来的代码。
工厂方法存在的问题与解决方法:客户端需要创建类的具体的实例,就是说我用户想要创建纽约的披萨就需要到纽约的工厂,创建伦敦的披萨就需要到伦敦的工厂,当工厂发生变化我们的用户也要跟着变化,所以我们就可以把工厂类抽象为接口,当我们用户需要去创建的时候只需要找到默认的工厂就可以了,把自己需要的参数传给工厂,便能得到自己想要产品,而不用根据产品去寻找不同的工厂,方便用户操作。这也就是我们接下来要说的抽象工厂模式。
1.3 抽象工厂模式
定义:定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类。
举例:(我们依然举pizza工厂的例子,pizza工厂有两个:纽约工厂和伦敦工厂)。
类图如下:
工厂的接口:
工厂的实现:
PizzaStroe的代码如下:
解决了工厂方法模式的问题:在抽象工厂中PizzaStroe中只需要传入参数就可以实例化对象。
总结一下三种模式:
简单工厂模式就是建立一个实例化对象的类,在该类中对多个对象实例化。工厂方法模式是定义了一个创建对象的抽象方法,由子类决定要实例化的类。这样做的好处是再有新的类型的对象需要实例化只要增加子类即可。抽象工厂模式定义了一个接口用于创建对象族,而无需明确指定具体类。抽象工厂也是把对象的实例化交给了子类,即支持拓展。同时提供给客户端接口,避免了用户直接操作子类工厂。