using System;
namespace FactoryPattern
{
//工厂模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。
// 工厂方法使一个类的实例化延迟到其子类。
//讲解说明:我们先回忆下,简单工厂模式(Simple Factory Pattern)
/// <summary>
///在讲解简单工厂模式时我们用了商场收费的例子
/// </summary>
public interface Ishoufei
{
double getMoney(double Rmb);
}
/// <summary>
/// 正常收费
/// </summary>
class NormalCash : Ishoufei
{
public double getMoney(double Rmb)
{
return Rmb;
}
}
class RebateCash : Ishoufei
{
/// <summary>
/// 折扣率
/// </summary>
private double moneyRebate=1d;
public RebateCash(double moneyRebate)
{
this.moneyRebate = moneyRebate;
}
public double getMoney(double Rmb)
{
return moneyRebate * Rmb;
}
}
/// <summary>
/// 简单工厂类
/// </summary>
public class SimpleFactory_Cash
{
public static Ishoufei CreateCash(string typ)
{
Ishoufei shf = null;
switch (typ)
{
case "正常收费": shf = new NormalCash(); break;
case "折扣收费": shf = new RebateCash(0.8); break;
}
return shf;
}
}
//我们把上面的代码改为工厂模式
/// <summary>
/// 抽象工厂接口
/// </summary>
public interface IFactory
{
Ishoufei CreateShoufei();
}
/// <summary>
/// 正常收费工厂
/// </summary>
public class NormalCashFactory : IFactory
{
public Ishoufei CreateShoufei()
{
return new NormalCash();
}
}
/// <summary>
/// 打折收费工厂
/// </summary>
public class RebateCashFactor : IFactory
{
/// <summary>
/// 折扣率
/// </summary>
private double RebateRmb = 1d;
public RebateCashFactor(double RebateRmb)
{
this.RebateRmb = RebateRmb;
}
public Ishoufei CreateShoufei()
{
return new RebateCash(RebateRmb);
}
}
class Program
{
static void Main(string[] args)
{
//应收金额
double YsRmb = 500d;
//返回结果
double resultRmb = 0d;
//操作类
Ishoufei shf = null;
//简单工厂模式
//shf = SimpleFactory_Cash.CreateCash("正常收费");
//工厂模式
IFactory Ifa = null;
string typ = "正常收费";
switch (typ)
{
case "正常收费":Ifa = new NormalCashFactory();break;
case "打八折":Ifa = new RebateCashFactor(0.8d);break;
}
shf = Ifa.CreateShoufei();
//结果输出
resultRmb = shf.getMoney(YsRmb);
Console.WriteLine(resultRmb);
Console.ReadKey();
}
}
//直接看代码的话,我们发现貌似 工厂模式比 简单工厂模式更加复杂。
//增加新功能的话,简单工厂模式,需要增加一个新的子类,然后需要修改 简单工厂类。
// 工厂模式,需要增加一个新的子类,在新增子类的工厂类,最后修改客户端。
//我自己对这块也比较疑惑,有人说是因为 简单工厂,增加新功能时需要修改 简单工厂类,违反了开放封闭原则,
//所以需要引入工厂模式。可是工厂模式同样需要修改客户端的代码,而且代码量比简单工厂模式大很多。
//我个人认为,可能是如果程序的逻辑复杂度提高的化,如果使用简单工厂模式,会使得简单工厂类的复杂和臃肿程度增大,
//不利于后期的维护。但是修改客户端代码也会遇到这个情况呀!有人说可以通过反射来解决客户端代码需要修改的问题,那
//同样的是不是也可以通过反射的方式类解决'简单工厂类的臃肿'问题呢?? 求解!!!
}
namespace FactoryPattern
{
//工厂模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。
// 工厂方法使一个类的实例化延迟到其子类。
//讲解说明:我们先回忆下,简单工厂模式(Simple Factory Pattern)
/// <summary>
///在讲解简单工厂模式时我们用了商场收费的例子
/// </summary>
public interface Ishoufei
{
double getMoney(double Rmb);
}
/// <summary>
/// 正常收费
/// </summary>
class NormalCash : Ishoufei
{
public double getMoney(double Rmb)
{
return Rmb;
}
}
class RebateCash : Ishoufei
{
/// <summary>
/// 折扣率
/// </summary>
private double moneyRebate=1d;
public RebateCash(double moneyRebate)
{
this.moneyRebate = moneyRebate;
}
public double getMoney(double Rmb)
{
return moneyRebate * Rmb;
}
}
/// <summary>
/// 简单工厂类
/// </summary>
public class SimpleFactory_Cash
{
public static Ishoufei CreateCash(string typ)
{
Ishoufei shf = null;
switch (typ)
{
case "正常收费": shf = new NormalCash(); break;
case "折扣收费": shf = new RebateCash(0.8); break;
}
return shf;
}
}
//我们把上面的代码改为工厂模式
/// <summary>
/// 抽象工厂接口
/// </summary>
public interface IFactory
{
Ishoufei CreateShoufei();
}
/// <summary>
/// 正常收费工厂
/// </summary>
public class NormalCashFactory : IFactory
{
public Ishoufei CreateShoufei()
{
return new NormalCash();
}
}
/// <summary>
/// 打折收费工厂
/// </summary>
public class RebateCashFactor : IFactory
{
/// <summary>
/// 折扣率
/// </summary>
private double RebateRmb = 1d;
public RebateCashFactor(double RebateRmb)
{
this.RebateRmb = RebateRmb;
}
public Ishoufei CreateShoufei()
{
return new RebateCash(RebateRmb);
}
}
class Program
{
static void Main(string[] args)
{
//应收金额
double YsRmb = 500d;
//返回结果
double resultRmb = 0d;
//操作类
Ishoufei shf = null;
//简单工厂模式
//shf = SimpleFactory_Cash.CreateCash("正常收费");
//工厂模式
IFactory Ifa = null;
string typ = "正常收费";
switch (typ)
{
case "正常收费":Ifa = new NormalCashFactory();break;
case "打八折":Ifa = new RebateCashFactor(0.8d);break;
}
shf = Ifa.CreateShoufei();
//结果输出
resultRmb = shf.getMoney(YsRmb);
Console.WriteLine(resultRmb);
Console.ReadKey();
}
}
//直接看代码的话,我们发现貌似 工厂模式比 简单工厂模式更加复杂。
//增加新功能的话,简单工厂模式,需要增加一个新的子类,然后需要修改 简单工厂类。
// 工厂模式,需要增加一个新的子类,在新增子类的工厂类,最后修改客户端。
//我自己对这块也比较疑惑,有人说是因为 简单工厂,增加新功能时需要修改 简单工厂类,违反了开放封闭原则,
//所以需要引入工厂模式。可是工厂模式同样需要修改客户端的代码,而且代码量比简单工厂模式大很多。
//我个人认为,可能是如果程序的逻辑复杂度提高的化,如果使用简单工厂模式,会使得简单工厂类的复杂和臃肿程度增大,
//不利于后期的维护。但是修改客户端代码也会遇到这个情况呀!有人说可以通过反射来解决客户端代码需要修改的问题,那
//同样的是不是也可以通过反射的方式类解决'简单工厂类的臃肿'问题呢?? 求解!!!
}