有关抽象工厂模式的疑问。
看了一篇讲“抽象工厂模式”的文章,先谈谈小弟的理解:
抽象工厂模式,就是由一系列的“产品集类”,组合在一起,而这些“产品集类”由都继承自一些公用的结口。 “工厂中的抽象类”包含一些公用的抽象方法,而抽象方法,则提供了客户访问工厂的路径,同时一些方法通过“.net反射”技术动态的加载程序集中的类,产生“子工厂”。从而使客户端只需要依赖于抽象工厂中的抽象方法,而屏蔽掉了具体实现功能的类。抽象工厂和接口同时使用,接口封闭了各个“产品集类”的功能源码,同时有提供了扩展其它产品的功能。而“抽象子工厂”中的方法,则提供了访问接口下具体子类的方式。不知道小弟理解的对不对?
现在的疑问是关于“屏蔽掉了具体实现功能的类”的实现。下面是一个访问抽象工厂的实例:
主程序:
namespace AbstractFactory
{
/// <summary>
/// 客户端程序调用
/// </summary>
public class Calculator
{
public static void Main(string[] args)
{
AbstractFactory factory = CommonFactory.GetInstance(); 获取抽象工厂的实例
Bonus bonus = factory.CreateBonus();
double bonusValue = bonus.Calculate();问题:在抽象工厂类中访问抽象方法“CreateBonus()”,就可以访问到“子抽象工厂”中具体实现返回“产品类实例”功能的抽象方法吗???“子抽象工厂”只是继承了这个方法啊?不明白,也就是在“抽象工厂”中可以访问“子抽象工厂”中具体实现“抽象工厂”声明的抽象方法的方法体吗?
Tax tax = factory.CreateTax();
double taxValue = tax.Calculate();double salary = 4000 + bonusValue - taxValue; Console.WriteLine("Salary is:" + salary);
Console.ReadLine();
}
}
}
看了一篇讲“抽象工厂模式”的文章,先谈谈小弟的理解:
抽象工厂模式,就是由一系列的“产品集类”,组合在一起,而这些“产品集类”由都继承自一些公用的结口。 “工厂中的抽象类”包含一些公用的抽象方法,而抽象方法,则提供了客户访问工厂的路径,同时一些方法通过“.net反射”技术动态的加载程序集中的类,产生“子工厂”。从而使客户端只需要依赖于抽象工厂中的抽象方法,而屏蔽掉了具体实现功能的类。抽象工厂和接口同时使用,接口封闭了各个“产品集类”的功能源码,同时有提供了扩展其它产品的功能。而“抽象子工厂”中的方法,则提供了访问接口下具体子类的方式。不知道小弟理解的对不对?
现在的疑问是关于“屏蔽掉了具体实现功能的类”的实现。下面是一个访问抽象工厂的实例:
主程序:
namespace AbstractFactory
{
/// <summary>
/// 客户端程序调用
/// </summary>
public class Calculator
{
public static void Main(string[] args)
{
AbstractFactory factory = CommonFactory.GetInstance(); 获取抽象工厂的实例
Bonus bonus = factory.CreateBonus();
double bonusValue = bonus.Calculate();问题:在抽象工厂类中访问抽象方法“CreateBonus()”,就可以访问到“子抽象工厂”中具体实现返回“产品类实例”功能的抽象方法吗???“子抽象工厂”只是继承了这个方法啊?不明白,也就是在“抽象工厂”中可以访问“子抽象工厂”中具体实现“抽象工厂”声明的抽象方法的方法体吗?
Tax tax = factory.CreateTax();
double taxValue = tax.Calculate();double salary = 4000 + bonusValue - taxValue; Console.WriteLine("Salary is:" + salary);
Console.ReadLine();
}
}
}
using System;namespace FactorySalary
{
/**//// <summary>
/// Factory类
/// </summary>
public class Factory
{
public Tax CreateTax()
{
return new ChineseTax();
} public Bonus CreateBonus()
{
return new ChineseBonus();
}
}
}
{
string classname = path + ".Adbanner";
return (IAdbanner)System.Reflection.Assembly.Load(path).CreateInstance(classname);
}