C# 设计模式 之 抽象工厂模式

原创 2007年09月23日 01:12:00

        工厂方法模式在于需要根据条件来控制对哪个类进行实例化,而抽象工厂模式确定实例化的往往设计到多个类,目的是创建一组相关或者相互依赖的对象提供支持!重点就是在于处理一组相关或者相互依赖类!

        举一个的经典实例,就是GUI工具箱。一个GUI工具箱就是一个对象,也是一个抽象工厂。GUI工具箱提供了各种GUI控件,并为它们提供了一个基本的东西,比如外观、颜色等。这样,当GUI控件有新版本了,可以再声明一个新的抽象工厂。那么软件就可以根据需要来使用那个一个抽象工厂类了。我们注意到各种GUI控件便是一组相关或者相互依赖类!

        它与工厂方法模式类似,不需要知道该对哪个类进行实例化。抽象工厂为用户提供了一个工厂,这个工厂便可以创建一系列的对象,而这些对象是相关的或是相互依赖的!  

        再看一个代码实例:

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

namespace AbstractFactory
...{
    
/**//// <summary>
    
/// 计算学分
    
/// </summary>

    public interface IComputeScore
    
...{
       
int ComputeScore();
    }


    
/**//// <summary>
    
/// 计算基本费用
    
/// </summary>

    public interface IComputeFee
    
...{
        
decimal ComputeFee();
    }


    
/**//// <summary>
    
/// 本科生计算学分的操作类
    
/// </summary>

    public class UndergraduateScore : IComputeScore
    
...{
        
public int ComputeScore()
        
...{
            Console.WriteLine(
"ComputeUndergraduateScore");
            
return 10;
        }

    }
  

    
/**//// <summary>
    
/// 研究生计算学分的操作类
    
/// </summary>

    public class GraduateScore : IComputeScore
    
...{
        
public int ComputeScore()
        
...{
            Console.WriteLine(
"ComputeGraduateScore");
            
return 20;
        }

    }


    
/**//// <summary>
    
/// 本科生计算基本费用的操作类
    
/// </summary>

    public class UndergraduateFee : IComputeFee
    
...{
        
public decimal ComputeFee()
        
...{
            Console.WriteLine(
"ComputeUndergraduateFee");
            
return 100M;
        }

    }


    
/**//// <summary>
    
///  研究生计算基本费用的操作类
    
/// </summary>

    public class GraduateFee : IComputeFee
    
...{
        
public decimal ComputeFee()
        
...{
            Console.WriteLine(
"ComputeGraduateFee");
            
return 200M;
        }

    }


    
/**//// <summary>
    
/// 计算抽象工厂类,它就包含了创建两个相关的计算类的方法
    
/// </summary>

    public abstract class ComputeFactory
    
...{
        
public static ComputeFactory GetInstance()
        
...{
            
//通过配置文件或者其他方式获得
            
//string factoryName = "AbstractFactory.UndergraduateFactory";
            
//ComputeFactory instance = (ComputeFactory)Assembly.Load(factoryName).CreateInstance(factoryName);
            ComputeFactory instance = new UndergraduateFactory();
            
return instance;
        }


        
public abstract IComputeScore CreateComputeScore();
        
public abstract IComputeFee CreateComputeFee();
    }


    
/**//// <summary>
    
/// 本科生计算工厂类
    
/// </summary>

     public class UndergraduateFactory : ComputeFactory
     
...{
         
public override IComputeScore CreateComputeScore()
         
...{
             
return new UndergraduateScore();
         }


         
public override IComputeFee CreateComputeFee()
         
...{
             
return new UndergraduateFee();
         }

     }


    
/**//// <summary>
     
/// 研究生计算工厂类
    
/// </summary>

    public class GraduateFactory : ComputeFactory
    
...{
        
public override IComputeScore CreateComputeScore()
        
...{
            
return new GraduateScore();
        }

        
public override IComputeFee CreateComputeFee()
        
...{
            
return new GraduateFee();
        }

    }


    
class Program
    
...{
        
static void Main(string[] args)
        
...{
            ComputeFactory computeFactory 
= ComputeFactory.GetInstance();
            IComputeScore computeScore 
= computeFactory.CreateComputeScore();
            IComputeFee computeFee 
= computeFactory.CreateComputeFee();
            
int score = computeScore.ComputeScore();
            
decimal fee = computeFee.ComputeFee();
            
//总费用 = 学分 * 150.0 + 基本费用
            decimal total = score * 150.0M + fee;
            Console.WriteLine(total);
            Console.ReadLine();
        }

    }

}


C#设计模式02-抽象工厂模式(附源码)

抽象工厂模式是所有工厂模式中最为抽象的模式,是抽象程度最高的模式,也是最难理解的一种工厂模式。         现在举一个生活中的案例来说明抽象工厂模式,电视是我们生活中必不可说的电器,但是电视有很多...
  • bhdxmaomi
  • bhdxmaomi
  • 2016年01月12日 15:07
  • 1152

抽象工厂模式(abstract)创建型模式 c#简单例子

抽象工厂模式(abstract)创建型模式 c#简单例子 适用于玩家用户数play1、play2....有变化,而行为move、jum无变化时...
  • zhgl7688
  • zhgl7688
  • 2014年12月11日 19:18
  • 900

C#抽象工厂模式的几种实现方法及比较

利用设计模式可以使我们的代码更灵活,更容易扩展,更容易维护。各种面向对象的程序设计语言都提供了基本相同的机制:比如类、继承、派生、多态等等。但是又有各自的特色,C# 中的反射机制便是一个很重要的工具,...
  • guxianga
  • guxianga
  • 2007年09月12日 11:58
  • 418

C#设计模式-抽象工厂模式源代码工程

  • 2017年02月19日 12:02
  • 37KB
  • 下载

C#设计模式:抽象工厂方法模式

今天说一下抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么,这样一来,客户就从...
  • dyllove98
  • dyllove98
  • 2013年02月20日 16:29
  • 1054

【C#设计模式-抽象工厂模式】

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。 抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,...
  • heyangyi_19940703
  • heyangyi_19940703
  • 2016年04月20日 13:04
  • 1978

使用Object-C实现23种设计模式之抽象工厂模式

23种设计模式的OC实现,23种设计模式之抽象工厂模式。
  • u013054715
  • u013054715
  • 2016年05月20日 10:08
  • 4239

C语言实现抽象工厂模式实例

借助于宏定义可以实同抽象工厂模式,而且代码简少。如: struct ems_class { char *name; rt_int16_t flag; rt_int16...
  • yujie_li
  • yujie_li
  • 2013年12月05日 18:24
  • 441

【java设计模式】之 抽象工厂(Abstract Factory)模式

1. 女娲的失误         上一节学习了工厂模式,女娲运用了该模式成功创建了三个人种,可是问题来了,她发现没有性别……这失误也忒大了点吧……竟然没有性别,那岂不是……无奈,只好抹掉重来了,于是所...
  • eson_15
  • eson_15
  • 2016年04月26日 23:49
  • 11622

设计模式之禅-抽象工厂模式

设计模式之禅- 抽象工厂模式
  • sunpeng19960715
  • sunpeng19960715
  • 2016年07月28日 23:13
  • 221
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 设计模式 之 抽象工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)