抽象工厂模式

来源:互联网 发布:刀剑乱舞极化胁差数据 编辑:程序博客网 时间:2024/06/07 06:25

工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是我们本文将要学习的抽象工厂模式的基本思想。


产品等级结构与产品族

       在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性,一般情况下,一个具体工厂中只有一个或者一组重载的工厂方法。但是有时候我们希望一个工厂可以提供多个产品对象,而不是单一的产品对象,如一个电器工厂,它可以生产电视机、电冰箱、空调等多种电器,而不是只生产某一种电器。为了更好地理解抽象工厂模式,我们先引入两个概念:

       (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();        }    }}




0 0