一、完成者信息:
姓名:韦庆
学号:07770104
二、模式信息
模式名称:简单工厂模式
模式概述:
简单工厂模式的实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品类的实例。简单工厂模式涉及到工厂角色、抽象产品角色和具体产品角色三个参与者。
● 工厂(Creator)角色
是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
● 抽象产品(Product)角色
是简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
● 具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
定义:
专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
生活场景:
在支付宝充值时有多种银行可供选择,包括农行、建行、工行等,我们现在需要选择其中一个银行给支付宝充值。那该如何实现更好呢?
终极目标:选择银行给支付宝充值,实现封装变化点的目的。
声明一个银行类,定义一个成员函数,该成员函数处理所有的充值情况。
实现代码:
public class bank
{
public void process(string type)
{
switch (type)
{
case "中国农业银行":
Console.WriteLine("使用中国农业银行支付");
break;
case "中国建设银行":
Console.WriteLine("使用中国建设银行支付");
break;
case "中国工商银行":
Console.WriteLine("使用中国工商银行支付");
break;
}
}
}
class Program
{
static void Main(string[] args)
{
bank b = new bank();
b.process("中国农业银行");
Console.ReadLine();
}
}
使用这种方式当你将来需要增加其他充值方式,例如天津银行,就需要手动维护这段switch语句,这种长篇代码的维护工作会浪费很多时间。
针对上述问题如果能够使用简单工厂模式,通过简单工厂类定义APM的抽象类,该类定义处理方法,具体子类通过继承抽象类的方法来实现处理过程,这样,增加其他APM就变得容易了,代码页更清晰。如下图:
实现代码:
/// <summary>
/// 抽象充值方式类
/// </summary>
public abstract class APM
{
public abstract void process();
}
/// <summary>
/// 具体子类,农行
/// </summary>
public class nh : APM
{
public override void process()
{
Console.WriteLine("使用中国农业银行支付");
}
}
/// <summary>
/// 具体子类,建行
/// </summary>
public class jh : APM
{
public override void process()
{
Console.WriteLine("使用中国建设银行支付");
}
}
public class APMFactory
{
public APM createAPM(string type)
{
switch (type)
{
case "中国农业银行":
return new nh();
case "中国建设银行":
return new jh();
default:
return null;
}
}
}
class Program
{
static void Main(string[] args)
{
APM apm;
APMFactory apmFactory = new APMFactory();
apm = apmFactory.createAPM("中国农业银行");
apm.process();
apm = apmFactory.createAPM("中国建设银行");
apm.process();
Console.ReadLine();
}
}
到此想要增加一个充值方式只要在声明一个具体子类即可,而不需要在switch中维护大量的逻辑代码。
3.验证阶段:
当前目标: 添加一个新的充值银行,如天津银行。
结果为:
实现代码:
/// <summary>
/// 抽象充值方式类
/// </summary>
public abstract class APM
{
public abstract void process();
}
/// <summary>
/// 具体子类,农行
/// </summary>
public class nh : APM
{
public override void process()
{
Console.WriteLine("使用中国农业银行支付");
}
}
/// <summary>
/// 具体子类,建行
/// </summary>
public class jh : APM
{
public override void process()
{
Console.WriteLine("使用中国建设银行支付");
}
}
public class tj : APM
{
public override void process()
{
Console.WriteLine("使用天津银行支付");
}
}
public class APMFactory
{
public APM createAPM(string type)
{
switch (type)
{
case "中国农业银行":
return new nh();
case "中国建设银行":
return new jh();
case "天津银行":
return new tj();
default:
return null;
}
}
}
class Program
{
static void Main(string[] args)
{
APM apm;
APMFactory apmFactory = new APMFactory();
apm = apmFactory.createAPM("中国农业银行");
apm.process();
apm = apmFactory.createAPM("中国建设银行");
apm.process();
apm = apmFactory.createAPM("天津银行");
apm.process();
Console.ReadLine();
}
}
4、抽象阶段:
思路描述:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
类结构图: