简单工厂模式04

一、完成者信息:

姓名:韦庆

学号:07770104

 

二、模式信息

模式名称:简单工厂模式

模式概述:

简单工厂模式的实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品类的实例。简单工厂模式涉及到工厂角色、抽象产品角色和具体产品角色三个参与者。

●     工厂(Creator)角色

是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

● 抽象产品(Product)角色

   是简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

● 具体产品(Concrete Product)角色

   是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

定义:

专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

生活场景:

    在支付宝充值时有多种银行可供选择,包括农行、建行、工行等,我们现在需要选择其中一个银行给支付宝充值。那该如何实现更好呢?

终极目标:选择银行给支付宝充值,实现封装变化点的目的。

 

  1. 1.       不假思索的思路:

声明一个银行类,定义一个成员函数,该成员函数处理所有的充值情况。

实现代码:

       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语句,这种长篇代码的维护工作会浪费很多时间。

 

  1. 2.       归纳阶段

针对上述问题如果能够使用简单工厂模式,通过简单工厂类定义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、抽象阶段:

思路描述:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

类结构图:

 

  

posted @ 2010-11-21 21:01  天津城建学院软件工程  阅读(438)  评论(0编辑  收藏  举报