工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是我们本文将要学习的抽象工厂模式的基本思想。
产品等级结构与产品族
在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性,一般情况下,一个具体工厂中只有一个或者一组重载的工厂方法。但是有时候我们希望一个工厂可以提供多个产品对象,而不是单一的产品对象,如一个电器工厂,它可以生产电视机、电冰箱、空调等多种电器,而不是只生产某一种电器。为了更好地理解抽象工厂模式,我们先引入两个概念:
(1) 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
(2) 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。
抽象工厂模式概述
抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。抽象工厂模式定义如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
///
//
// 抽象工厂模式 设计界面库框架
//
///
namespace SkinKu
{
/// <summary>
/// 按钮接口: 抽象产品
/// </summary>
interface Button
{
void display();
}
/// <summary>
/// Spring按钮类: 具体产品
/// </summary>
class SpringButton : Button
{
public void display()
{
Console.WriteLine("显示浅绿色按钮");
}
}
/// <summary>
/// summer按钮类: 具体产品
/// </summary>
class SummerButton : Button
{
public void display()
{
Console.WriteLine("显示浅蓝色按钮");
}
}
/// <summary>
/// 文本框接口: 抽象产品
/// </summary>
interface TextField
{
void display();
}
/// <summary>
/// Spring 文本框
/// </summary>
class SpringTextField : TextField
{
public void display()
{
Console.WriteLine("显示绿色边框文本框");
}
}
/// <summary>
/// Summer文本框类: 具体产品
/// </summary>
class SummerTextField : TextField
{
public void display()
{
Console.WriteLine("显示蓝色边框文本框");
}
}
/// <summary>
/// 组合框接口
/// </summary>
interface ComboBox
{
void display();
}
/// <summary>
/// Spring组合框类: 具体产品
/// </summary>
class SpringComboBox : ComboBox
{
public void display()
{
Console.WriteLine("显示绿色边框组合框");
}
}
/// <summary>
/// Summer组合框类: 具体产品
/// </summary>
class SummerComboBox : ComboBox
{
public void display()
{
Console.WriteLine("显示蓝色边框组合框");
}
}
/// <summary>
/// 界面皮肤工厂接口: 抽象工厂
/// </summary>
interface SkinFactory
{
Button createButton();
TextField createTextField();
ComboBox createComboBox();
}
/// <summary>
/// Spring皮肤工厂: 具体工厂
/// </summary>
class SpringSkinFactory : SkinFactory
{
public Button createButton()
{
return new SpringButton();
}
public TextField createTextField()
{
return new SpringTextField();
}
public ComboBox createComboBox()
{
return new SpringComboBox();
}
}
/// <summary>
/// Summer皮肤工厂: 具体工厂
/// </summary>
class SummerSkinFactory : SkinFactory
{
public Button createButton()
{
return new SummerButton();
}
public TextField createTextField()
{
return new SummerTextField();
}
public ComboBox createComboBox()
{
return new SummerComboBox();
}
}
class Program
{
static void Main(string[] args)
{
//使用抽象层定义
SkinFactory factory;
Button bt;
TextField tf;
ComboBox cb;
factory = new SummerSkinFactory();
// factory = new SpringSkinFactory();
bt = factory.createButton();
tf = factory.createTextField();
cb = factory.createComboBox();
bt.display();
tf.display();
cb.display();
}
}
}