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