抽象工厂

      前几天面试的时候,被问到什么是抽象工厂,可能我本身用的时候就比较多,但是有一些细节的东西忘记了,所以现在重新mark一下,以便以后的需要。

     比如说现在我有一份需求:

     1.需要一个类,是用来计算的,但是具体是计算什么,不清楚

     2.就例如说,现在要计算学生的学费,学分

     3.但是学生也有小学,初中,高中,本科,研究生等,因此也有不同的计算方式。

     4.如何去实现这些需求呢?

      思路:

      1.既然都需要计算,不如定义一个CalculatorFactory 抽象工厂类,然后里面定义 计算学分,学费的接口

      2.定义 本科生 计算工厂类,和研究生计算工程类,继承CalculatorFactory,这样的话,就有自己不同的计算学分和学分的方法。

       例子各个类如图:

接下来附上各种源代码:

    class Program
    {
        static void Main(string[] args)
        {
            //1.创建抽象工厂对象,通过反射实例化子类对象-研究生计算工厂
            //2.根据研究生计算工厂定义的计算学费和学分,计算出研究生的学分和学分
            //3.输出
            CalculatorFactory CalFactory = CalculatorFactory.GetInstance("MyAbstractFactory.GraduateFactory");
            ICalculatorScore Calscore = CalFactory.CreateCalScore();
            ICalculatorFee Calfee = CalFactory.CreateCalFee();
            int score = Calscore.CalculatorScore();
            decimal fee = Calfee.CalculatorFee();
            //4.重上面的代码可以开出来,new关键字没有出现过,这也符合抽象工厂的原则,少用过多的new
            Console.WriteLine("学分为:"+score.ToString()+"学费为"+fee.ToString());
            Console.ReadKey();
        }
    }

CalculatorFactory:

    /// <summary>
    /// 抽象工厂,主要用于计算,具体要计算什么内容,可以通过里面定义的接口实现
    /// </summary>
   public abstract class CalculatorFactory
    {
       /// <summary>
       /// 通过传入的子类工厂,反射动态创建对应的实例
       /// </summary>
       /// <param name="FacName">子类工厂</param>
       /// <returns></returns>
       public static CalculatorFactory GetInstance(string FacName)
       {
           //通过反射机制动态创建 对应的工厂
           string factoryName = FacName;
           CalculatorFactory instance = (CalculatorFactory)Assembly.Load("MyAbstractFactory").CreateInstance(factoryName);
           return instance;
       }
       public abstract ICalculatorScore CreateCalScore();
       public abstract ICalculatorFee CreateCalFee();
    }

ICalculatorFee:

    /// <summary>
    /// 计算费用接口
    /// </summary>
   public  interface ICalculatorFee
    {
       decimal CalculatorFee();
    }

ICalculatorScore:

    /// <summary>
    /// 计算学分接口
    /// </summary>
   public interface ICalculatorScore
    {
       int CalculatorScore();
    }

GraduateFactory:

    /// <summary>
    /// 研究生计算工厂类
    /// </summary>
   public class GraduateFactory:CalculatorFactory
    {
       public override ICalculatorScore CreateCalScore()
       {
           return new GraduaterScore();
       }
       public override ICalculatorFee CreateCalFee()
       {
           return new GraduaterFee();
       }
    }

GraduaterScore:

    /// <summary>
    /// 研究生计算学分
    /// </summary>
   public class GraduaterScore:ICalculatorScore
    {
        public int CalculatorScore()
        {
            Console.WriteLine("我是研究生,实现学分计算接口,计算学分");
            return 150;
        }
    }

GraduaterFee:

   public class GraduaterFee:ICalculatorFee
    {
        public decimal CalculatorFee()
        {
            Console.WriteLine("研究生计算学费,实现学分接口");
            return 1500M;
        }
    }

最后附加上源代码(VS2012):http://pan.baidu.com/share/link?shareid=4182058942&uk=4060483776

posted @ 2013-11-05 11:38  xhhha123  阅读(218)  评论(0编辑  收藏  举报