抽象工厂模式

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


产品等级结构与产品族

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

       (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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值