创建型-工厂模式
发布网友
发布时间:2024-10-09 02:23
我来回答
共1个回答
热心网友
时间:2024-10-22 13:41
(一)简单工厂模式
模式定义
简单工厂模式(Simple Factory Pattern):又称静态工厂方法(Static Factory Method)模式,属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式类图:
简单工厂模式包含如下角色:
下面是例子:
创建一个 接口 Shape,和实现接口的类 Circle,Square,Rectangle。
当外界需要某物品时,只需要调用工厂ShapeFactory 的 GetShape(类型)即可。
Shape 接口:
具体的实现类:
简单工厂:
客户端:
我们再看一下简单工厂的核心代码:
如果这个时候,需求要增加一种形状,那么还得修改上述代码!!!
这就是简单工厂的弊病,下个工厂模式可以改善这个情况。
简单工厂模式的优点
简单工厂模式的缺点
(二)工厂模式
工厂模式属于创造型的模式,利用工厂模式,在创建新对象的时候,可以屏蔽复杂的创造逻辑,而且只需要一个共同的接口来指向新的创建对象。
Gof对工厂模式的定义:
工厂方法模式是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说 每个对象都有一个与之对应的工厂 。
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
工厂方法模式类图:
工厂方法模式角色分配:
适用场景
工厂方法模式实例
上面简单工厂例子中的图形接口以及相关图像实现类代码不变。我们只需要增加一个工厂接口以及实现这个接口的工厂类即可。
工厂接口:
圆形工厂类:
长方形工厂类:
客户端:
这样如果需求上面要增加一种形状,只需要增加一个形状类和一个对应的形状工厂即可。无需修改其他的具体产品和具体工厂。符合开闭原则。
工厂方法模式的优点
工厂方法模式的缺点
(三)抽象工厂
学习抽象工厂之前,先来了解下产品族和产品等级结构:
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。
如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。
产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
抽象工厂模式定义:
抽象工厂模式又称为Kit模式,属于对象创建型模式。
抽象工厂模式提供了一种方式,可以将同一产品族的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。
抽象工厂模式类图:
抽象工厂模式包含如下角色:
每个具体的工厂生产同一个等级中的所有产品。通俗来讲就是每个具体的工厂生产一套产品。
比如一个水杯工厂生产茶杯和茶壶。
举一个例子:
这里有3种产品,冰箱,彩电,洗衣机。冰箱有Work方法,彩电有Open方法,洗衣机有Wash方法。
代码:
为了简便,这里只列举冰箱和彩电代码,洗衣机省略。
冰箱:
彩电:
抽象工厂类:
创建工厂:
客户端:
优点
缺点
适用环境
在以下情况下可以使用抽象工厂模式:
模式应用
在很多软件系统中需要更换界面主题,要求界面中的按钮、文本框、背景色等一起发生改变时,可以使用抽象工厂模式进行设计。就是一个抽象工厂对应一套东西。
总结:
举一个例子:
这里有3种产品,冰箱,彩电,洗衣机。他们都有共同的工作Work方法。
如果用简单工厂实现的话,只需要一个工厂,一个方法,传递不同的参数,制造不同的产品。
如果用工厂模式实现的话,需要一个工厂基类,基类中有一个抽象方法Create();派生出冰箱工厂,彩电工厂,洗衣机工厂。每个工厂负责各自产品的生产。
再升级下例子,现在有海尔冰箱,海尔彩电,海尔洗衣机;格力冰箱,格力彩电,格力洗衣机;
如果用抽象工厂模式实现的话,需要一个工厂基类,基类中有3个方法分别生产冰箱,彩电,洗衣机。派生出海尔工厂和格力工厂。
如果要增加新的品牌比如美的,那么不用修改具体工厂代码,只需要新增一个美的工厂即可。如果不是增加一个品牌,而是增加一个新的产品,比如饮水机,那么就需要修改大量的工厂代码了。
无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。