三个工厂模式

    工厂模式专门负责将大量有共同接口的类实例化,可以动态决定哪一个类实例化,不必事先知道每次要实例化哪一个类,客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。不过当产品修改时,工厂类也要做相应的修改。工厂模式在《大话设计模式》里面有三种相关的模式,分别是简单工厂模式,工厂方法模式和抽象工厂模式,下面来看一下它的UML图表示形式、代码展示和优缺点。


    简单工厂模式:


UML图三个工厂模式_第1张图片

简单运算工厂类代码:

public class OperationFactory
    {
        public static Operation createOprate(string operate)
        {
            Operation oper = null;
            switch (operate )
            {
                case "+":
                    oper = new OperationAdd();
                    break;
                case "-":
                    oper = new OperationAdd();
                    break;
                case "*":
                    oper = new OperationAdd();
                    break;
                case "/":
                    oper = new OperationAdd();
                    break;
            }
            return oper;
        }
        
    }
优点:客户端代码不需要修改,不管是控制台程序,Web程序,Windows程序,PDA或者手机程序,都可以用这段代码           来实现计算器的功能。

缺点:当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。


    工厂方法模式


UML图

三个工厂模式_第2张图片

代码展示:

interface IFactory      //工厂接口
    {
        Operation CreateOperation();
    }
    class AddFactory : IFactory  //加法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }
    class SubFactory : IFactory   //减法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }
    class MulFactory : IFactory   //乘法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationMul();
        }
    }
    class DivFactory : IFactory    //除法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }
优点:增加一个运算类,例如增加求M数的N次方类时,就不需要更改原有的工厂类了,只需要增加此功能的运算类和         相应的工厂类就可以了。它克服了简单工厂违背开闭原则的缺点,又保持了封装对象创建过程的优点。

缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。


    抽象工厂模式


UML图
三个工厂模式_第3张图片

代码展示:

<pre name="code" class="csharp">interface IUser       //IUser接口,用于客户端访问,解除与具体数据库访问的耦合
    {
        void Insert(IUser user);
        User GetUser(int id);
    }
    class SqlserverUser :IUser  //SqlserverUser类,用于访问SQL Server的User
    {
        public void Insert(User user)
        {
            Console.WriteLine("在SQL Server中给User表增一条记录");
        }
        public User GetUser(int id)  
        {
            Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
            return null;
        }
    }
    class AccessUser: IUser     //AccessUser类,用于访问Access的User
    {
        public void Insert(User user)
        {
            Console.WriteLine("在Access中给User表增加一条记录");
        }
        public User GetUser(int id)
        {
            Console.WriteLine("在Access中根据ID得到User表一条记录");
            return null ;
        }
    }
    interface IDepartment     //IDepartment接口,用于客户端访问,解除与具体数据库访问的耦合
    {
        void Insert(IDepartment department);
        IDepartment GetDepartment(int id);
    }
    class SqlserverDepartment:IDepartment  //SqlserverDepartment类,用于访问SQL Server的Department
    {
        public void Insert(IDepartment department)
        {
            Console.WriteLine("在SQL Server中给Department表增加一条记录");
        }
        public IDepartment GetDepartment(int id )
        {
            Console.WriteLine("在SQL Server中根据ID得到Department表一条记录");
            return null;
        }
    }
    class   AccessDepartment:IDepartment                                //AccessDepartment类,用于访问Access的Department
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在Access中给Department表增加一条记录");
        }
        public Department GetDepartment(int id)
        {
            Console.WriteLine("在Access中根据ID得到Department表一条记录");
            return null ;
        }
    }
    interface IFatory//IFactory接口,定义一个创建访问Department表对象的抽象的工厂接口
    {
        IUser CreateUser();
        IDepartment CreateDepartment():  //增加接口的方法
    }
    class SqlServerFactory :IFactory //SqlServerFactory类,实现了IFactory接口,实例化SqlserverUser和SqlserverDepartment
    {
        public IUser CreateUser()
        {
            return new SqlserverUser();
        }
        public  IDepartment CreateDepartment()  //增加了SqlserverDepartment工厂
        {
            return new SqlserverDepartment();
        }
    }  
     class AccessFactory:IFactory //AccessFactory类,实现了IFactory接口,实例化AccessUser和AccessDepartment
     {
         public IUser CreateUser()
         {
             return new AccessUser();
         }
         public IDepartment CreateDepartment()  //增加了AccessDepartment工厂
         {
             return new AccessDepartment ();
         }
     }
 
 
 
 优点:易于交换产品系列。 
 

缺点:如果你的需求来自增加功能,比如我们现在要增加项目表Project,那就至少需要增加三个类,IProject、SqlserverProject、AccessProject,还需要更改IFactory、SqlserverFactory和AccessFactory才可以完全实现。

你可能感兴趣的:(三个工厂模式)