zoukankan      html  css  js  c++  java
  • 抽象工厂

          前几天面试的时候,被问到什么是抽象工厂,可能我本身用的时候就比较多,但是有一些细节的东西忘记了,所以现在重新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

  • 相关阅读:
    python3爬虫-爬取新浪新闻首页所有新闻标题
    Python第三方库官网
    网页图片尺寸查看方法
    jquery插件开发常用总结一
    谷歌浏览器的input自动填充出现黄色背景解决方案(在已经输入内容之后)
    在背景图上面加滤镜层之后添加内容
    你是第几位访客简单实现--大学城项目首页
    html5总结
    win10怎么修改svn的用户和密码
    properties中的编码如何生成:例如u7AD9u70B9这种
  • 原文地址:https://www.cnblogs.com/xhhha/p/AbstractFactory.html
Copyright © 2011-2022 走看看