.NET简谈设计模式之(抽象工厂模式)

我们继续学习设计模式系列文章

今天要讲的是设计模式中经常被用到的“工厂模式”,所谓工厂模式就是将对象的创建交给一个叫做工厂的对象来统一进行处理。主要是将对象的依赖关系进行解耦,消除对象之间的直接耦合。那么工厂的使用有几种方式呢?那就要看我们对工厂的理解了,工厂是创建对象的一个逻辑名称,工厂可以是一个方法、一个静态类等等。只要起到对象的创建就能给它赋予上一个工厂的名称。

那么什么是抽象工厂呢?我想很多人对它的理解并不是很透彻,甚至有的人就觉得工厂一定要是抽象的。我表示不理解,一个抽象类中连一个抽象的、虚的成员都没有,我想问这个类是干什么用的,仅仅是模仿《设计模式》中的例子在做吗。我想通过这篇文章能将工厂模式的各种应用方式进行讲解清楚,好让不太清楚的朋友能正确的认识到OOP的本质。

我们先来理清工厂模式的本质是什么,它出现的目的是什么,只有对它有个正确的认识才能引导我们去正确的理解。[王清培版权所有,转载请给出署名]

工厂模式:提供创建对象的接口。

这短短的一句话就概括了工厂的真正本意。在使用模式的时候,我们要适当的取舍,模式是很完善的,是前辈们用一生的经验总结来的,我们不得不承认它确定是很完美。

我们先来介绍“简单工厂模式”是怎么回事。简单工厂是工厂的第一种抽象表示,也是比较简单一种,比较复杂的就是抽象工厂,它是工厂最高的抽象应用,我们最后详细的讲解。

简单工厂介绍:简单工厂就是将对象的实例化提取出来形成专门负责创建对象的独立的对象,我们称之为简单工厂。这种使用方式其实有点编程经验的朋友都会想到,可以不把它当成是一种设计模式,但是书中有提到,所以为了不引起群喷我就麻烦点还是写出来。[王清培版权所有,转载请给出署名]

工厂方法:将对象的创建延伸到子类中实现。

其实从我个人观点来看工厂方法的话,我也不认为它是一种设计模式,在我们定义一个抽象类的时候,总会有一些抽象方法在里面,这些方法可能有的是创建对象的,有的是做一些其他的事情的。这样的设计是很常理的,抽象方法就得由子类来进行实现。我倒觉得抽象工厂是一种名副其实的设计模式。

抽象工厂:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象

这样的定义可能对熟悉抽象工厂的朋友来说一目了然,初学者可能迷糊。我们还是用图来形象的表示吧;

1:

这幅图的大概意思是:水果贩子有很多种,每种贩子都想批发自己要卖的水果。我们重点放在工厂这边,这里有好多工厂分别生产不同的水果。我们要对工厂进行抽象,似乎已经引导我们去提取抽象工厂的概念,工厂是具体的类,是专门负责生产某一种类型的水果,遵循设计模式所提倡的原则,我们要将变化的部分抽象出来。所以我们要对具体工厂进行抽象形成抽象工厂,抽象工厂定义统一的获取水果的接口,任何客户贩子都用这统一的接口进行批发水果。

2:

所有的客户通过抽象工厂定义的接口获取水果,我们下面用代码来进行讲解。

抽象工厂代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    /// <summary>
    /// 水果抽象工厂
    /// </summary>
    public abstract class FruitAbstractFactory
    {
        /// <summary>
        /// 水果名称,表示哪种水果如:苹果、香蕉、橘子
        /// </summary>
        public string FruitName { get; set; }
        /// <summary>
        /// 抽象方法,获取要批发水果的
        /// </summary>
        /// <returns>要批发的水果</returns>
        public abstract string GetCurrentFruit();
    }
}

苹果工厂代码: 

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    /// <summary>
    /// 苹果工厂
    /// </summary>
    public class AppleFactory : FruitAbstractFactory
    {
        public AppleFactory()
        {
            FruitName = "苹果";
        }
        /// <summary>
        /// 重写基类的获取水果方法
        /// </summary>
        /// <returns>要批发的水果</returns>
        public override string GetCurrentFruit()
        {
            return "给你:" + base.FruitName;
        }
    }
}

香蕉工厂代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    /// <summary>
    /// 香蕉工厂
    /// </summary>
    public class BananaFactory : FruitAbstractFactory
    {
        public BananaFactory()
        {
            FruitName = "香蕉";
        }

        public override string GetCurrentFruit()
        {
            return "给你:" + base.FruitName;
        }
    }
}

 

 橘子工厂代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    /// <summary>
    /// 橘子工厂
    /// </summary>
    public class TangerineFactory : FruitAbstractFactory
    {
        public TangerineFactory()
        {
            FruitName = "橘子";
        }
        public override string GetCurrentFruit()
        {
            return "给你:" + base.FruitName;
        }
    }
}

模拟调用代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            FruitAbstractFactory fruitfactory = new AppleFactory();//苹果工厂
            Console.WriteLine(fruitfactory.GetCurrentFruit());
            Console.ReadLine();
            fruitfactory = new BananaFactory();//香蕉工厂
            Console.WriteLine(fruitfactory.GetCurrentFruit());
            Console.ReadLine();
            fruitfactory = new TangerineFactory();//橘子工厂
            Console.WriteLine(fruitfactory.GetCurrentFruit());
            Console.ReadLine();
        }
    }
}

总结:抽象工厂的大概原理就讲完了。其实这里可以将水果贩子也进行抽象,形成工厂方法,然后在具体的贩子里面进行水果工厂的调用。由于时间关系我就不写了。

时间: 2024-10-02 01:46:09

.NET简谈设计模式之(抽象工厂模式)的相关文章

乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) 作者:webabcd 介绍 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例 有Message和MessageModel,Message有一个Insert()方法,该方法的参数是MessageModel. AbstractMessageModel usi

C#设计模式(4)——抽象工厂模式

原文:C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专

设计模式之四(抽象工厂模式第三回合)

原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如IFactory factory=new AccessFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置.我们的设计不能去防止需要的变更,那么我们的理想便是让改动变得最小,那么现在如果你要更改数据库访问,

设计模式之四(抽象工厂模式第一回合)

原文:设计模式之四(抽象工厂模式第一回合) 前言 首先关于抽象工厂模式的学习,我们需要慢慢的,由浅入深的进入.不能单刀直入,否则可能达不到预期学明白的目标. 第一回合  首先我们从最简单的数据访问程序开始吧. 下面先来看一个简单的小例子,代码很简单 public class User { public int ID{get;set;} public string Name{get;set;} } 一个简单的实体类,也相当于在SqlServer数据库中建立了相同的数据表 public class

C++设计模式之抽象工厂模式_C 语言

问题描述 之前讲到了C++设计模式--工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Product的,所以工厂方法模式中,每个工厂只能创建单一种类的产品,当需要生产一种全新的产品(不继承自Product)时,发现工厂方法是心有余而力不足. 举个例子来说:一个显示器电路板厂商,旗下的显示器电路板种类有非液晶的和液晶的:这个时候,厂商建造两个工厂,工厂A负责生产非液晶显示器电路板,工厂B负责生产

设计模式之抽象工厂模式

关于设计模式找到了一个系列讲的非常到位,也很容易让人理解,这里我也是看下面的博客来理解抽象工厂模式. http://blog.csdn.net/column/details/loveyun.html?&page=2 理解抽象工厂应先了解产品族.产品等级的概念: 所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族.比如AMD的主板.芯片组.CPU组成一个家族,Intel的主板.芯片组.CPU组成一个家族.而这两个家族都来自于三个产品等级:主板.芯片组.CPU.一个等级结构是由相同的

Python设计模式之抽象工厂模式_python

python面向对象编程入门,我们需要不断学习进步 """抽象工厂模式的实现""" import random class PetShop: """宠物商店""" def __init__(self, animal_factory=None): """宠物工厂是我们的抽象工厂.我们可以随意设置.""" self.pet_fact

艾伟_转载:.NET设计模式:抽象工厂模式(Abstract Factory)

概述 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或

Head First设计模式之抽象工厂模式

一.定义 给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:     1)系统中有多个产品族,而系统一次只可能消费其中一族产品.      2)同属于同一个产品族的产品以其使用.  二.结构 抽象工厂模式的各个角色(和工厂方法一样):      1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.      2)具体工厂角色:它含有和具体业务逻辑有关的代码.