" );}} ③SummerButton:充当具体产品 class SummerButton : Button{ pu

时间:2022-05-22 08:30:22

" );}} ③SummerButton:充当具体产品 class SummerButton : Button{ pu

观点

要理解抽象工厂模式,首先要了解几个观点,一个是产品品级布局,另一个是产品族。

工厂要领模式中引入了工厂品级布局,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂要领模式中的每个具体工厂只有一个或者一组重载的工厂要领,只能出产一种产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销,有时候可能需要一个工厂能够供给多种产品东西,而不是单一的产品东西,例如海尔电器公司可以出产海尔电视、海尔冰箱、海尔洗衣机等,公司或工厂可以出产多种产品,而不是单一的某个产品。此时,可以考虑将一些相关的产品构成一个“产品族”,由同一个工厂来统一出产,这就是本章将要学习的抽象工厂模式的根基思想。为了更好的理解抽象工厂模式,先引入以下两个观点,就是产品品级布局和产品族。

产品品级布局:产品品级布局就是产品的担任布局,例如一个抽象类是电视机,其子类可以是海尔电视、海信电视、小米电视,则抽象电视机与具体品牌的电视机之间组成了一个产品的品级布局,,抽象电视机是父类,而具体品牌的电视机是其子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂出产的,位于差别产品品级布局中的一组产品。例如海尔电视、海尔冰箱和海尔洗衣机是同一个产品族,这个产品族由三个分属差此外产品品级布局中,组合成了一个产品族。

产品品级布局和产品族的示意图如下:

" );}} ③SummerButton:充当具体产品 class SummerButton : Button{ pu

在上图,差别颜色的多个正方形、圆形和椭圆形分袂组成了3个差此外产品品级布局,而颜色不异的正方形,圆形和椭圆组成了一个产品族,每一个形状东西都位于某个产品族,并属于某个产品品级布局,上图共有5个产品族,分属于3个产品品级布局中。只要指定一个产品所处的产品族和他所属的品级布局,就可以确定这个独一的产品。

抽象工厂模式概述

当系统所供给的工厂出产的具体产品并不是一个简单的额东西,而是多个位于差别产品品级布局、属于差别类型的具体产品时就可以使用抽象工厂模式。抽象工厂模式时多有形式的工厂模式中最为抽象和最具一般性的一种形式。抽象工厂模式与工厂要领模式最大的区别在于,工厂要领模式针对单一的产品布局,而抽象工厂模式需要面对多个产品品级布局。当一个工厂品级布局可以创建出分属于差别产品品级布局的一个产品族中的所有东西时,抽象工厂模式比工厂要领模式更为简单、更有效率。抽象工厂模式的示意图如下:

" );}} ③SummerButton:充当具体产品 class SummerButton : Button{ pu

上图中,每一个具体工厂都可以出产一个产品族上面的所有产品,例如颜色不异的正方形、圆形、椭圆。这些产品分属于三个差此外产品品级布局。如果要用简单工厂模式来做,只设计一个工厂类,在此中要写15个创建差别产品的要领,职责过重;如果要用工厂要领模式来写,要分袂写15个差此外实体工厂以及三个差此外抽象工厂(工厂要领模式是针对单一产品品级布局,所以要写三个差此外抽象工厂代表每一个产品品级布局),系统中的类的个数成倍增加,系统开销和庞大度都由上升;目前为止最好的步伐就是使用抽象工厂模式了,只需要创建一个针对差别产品品级布局构成的产品族的一个抽象的工厂类,以及五个分袂出产差别产品族的实体工厂。可以看出抽象工厂大大的减少了系统中类的数量。下面列出上面提到的关于抽象工厂模式中的各个构成部分:

①AbstractFactory(抽象工厂):它界说了一组创建一族产品的要领,每一个要领对应一种产品。
②ConcreteFactory(具体工厂):它担任或实现了抽象工厂,将抽象工厂界说的要领实现为本身特有的行为来生成特定的一族产品类。
③AbstractProduct(抽象产品):它为每种产品声明接口,声明了每种产品做具有的业务要领。
④ConcreteProduct(具体产品):界说具体的产品东西,实现或担任抽象产品中所界说的业务要领。

下图为抽象工厂模式的类图:

" );}} ③SummerButton:充当具体产品 class SummerButton : Button{ pu

抽象工厂模式的实现

范例的抽象工厂的代码

abstract class AbstractFactory { public abstract AbstractProductA CreateProductA(); //工厂要领一 public abstract AbstractProductB CreateProductB(); //工厂要领二 …… }

范例的具体工厂的代码