求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 
 

设计模式教程
简单工厂模式
AbstractFactory模式
FactoryMethod模式
Prototype模式
Singleton模式
Template Method模式
Builder模式
Class-Adapter 模式
Facade 模式
Object-Adapter 模式
Bridge模式
 
 

简单工厂模式
 
来源:火龙果软件   作者:俎涛
 
8376 次浏览
150次  

功能需求如下:

重构前的设计

重构前的代码

using System;

 

class EtherNet

{

    public  void Send(string data)

    {

        Console.WriteLine("EtherNet is Sending: {0}",data);

    }

}

class COM

{

    public  void Transform(string data)

    {

        Console.WriteLine("COM is Transforming :{0}", data);

    }

}

class USB

{

    public void Transform(string data)

    {

        Console.WriteLine("USB is Transforming :{0}", data);

    }

}

 

class Computer

{

    [STAThread]

    static void Main(string[] args)

    {

        Console.WriteLine("input device type");

        string deviceType = Console.ReadLine().ToLower();

 

        Console.WriteLine(" input data");

        string data = Console.ReadLine().ToLower();

 

        switch (deviceType)

        {

            case "net":

                EtherNet net = new EtherNet();

                net.Send(data);

                break;

            case "com":

                COM com = new COM();

                com.Transform(data);

                break;

            case "usb":

                USB usb = new USB();

                usb.Transform(data);

                break;

            default:

                Console.WriteLine(" 对不起,没有此种设备!!");

                break;

        }

    }

}


                              

问题分析:

当引入了新的设备,Computer会发生波动,不符合OCP原则(面向扩展开放,面向修改关闭)

应用简单工程模式

问题 应用调用 多个类,以后可能会加入新的类,这会引起调用者的波动。
环境 多个类具有行为类似性
解决方案 把多个类似行为的类抽象为一个类,把抽象类作为稳定的调用点,同时用工厂封装不同类的实例化,封装变化。
效果 调用类不会受新加入的类型影响。
实例 Computer调用不同的Device发送数据

应用模式后的设计

设计类图如下:

对象交互如下:

应用模式后的代码

using System;

 

interface  Device

{

      void Send(string data) ;

}

 

class EtherNet : Device

{

    public  void Send(string data)

    {

        Console.WriteLine("EtherNet is Sending: {0}",data);

    }

}

class COM : Device

{

    public  void Send(string data)

    {

        Console.WriteLine("COM is Transforming :{0}", data);

    }

}

class USB : Device

{

    public void Send(string data)

    {

        Console.WriteLine("USB is Transforming :{0}", data);

    }

}

 class Wireless : Device

{

    public void Send(string data)

    {

        Console.WriteLine("Wireless is Transforming :{0}", data);

    }

}

class FactoryDevice

{

   Device device = null;

    public Device CreateDevice(string deviceType)

    {

 

        switch (deviceType)

        {

            case "net":

                device = new EtherNet();

                break;

            case "com":

                device = new COM();

                break;

            case "usb":

                device = new USB();

                break;

            case "wireless":

                device = new Wireless();

                break;

            default:

                Console.WriteLine(" 对不起,没有此种设备!!");

                break;

        }

        return device;

    }

}

class Computer

{

    [STAThread]

    static void Main(string[] args)

    {

        Console.WriteLine(" 请输入设备类型:");

        string deviceType = Console.ReadLine().ToLower();

 

        Console.WriteLine(" 请输入要发送的数据:");

        string data = Console.ReadLine().ToLower();

 

        FactoryDevice fac = new FactoryDevice();

        Device device = fac.CreateDevice(deviceType);

 

       device.Send(data);

Console.ReadLine();

    }

}


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



8376 次浏览
150次
 捐助