zoukankan      html  css  js  c++  java
  • 设计模式-工厂方法模式

    场景描述:

    假设现在有一个User类(如下),原本设计程序使用SqlServer访问,现在因为客户需求的变化,需要使用Access来访问。

    public class User
        {
            private int id;
            private string name;
    
            public int ID
            {   
                get { return id; }
                set { id = value; }
            }
    
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
        }

    对于这种场景,单纯的去修改访问数据库代码,把SqlServer的访问类,修改成Access的访问类,不仅会出现很多问题,因为两种数据库查询语句本身就有区别,最重要的是扩展性非常差,万一以后需要改成用MySql来访问,又是一通改。所以这里用到了工厂方法模式。
    首先定义一个User对象接口

    //User对象接口类
        public interface IUser
        {
            //业务逻辑
            void Insert(User user);
    
            User GetUser(int i);
        }

    然后是两种数据库实现的User对象,都继承于IUser接口

    //Sql数据库User对象
        public class SqlUser : IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("InsertSqlUser");
            }
    
            public User GetUser(int i)
            {
                Console.WriteLine("SqlUserList");
                return null;
            }
        }
    
    
    //Access数据库User对象
        public class AccessUser : IUser
        {
            public void Insert(User user)
            {
                Console.WriteLine("InsertAccessUser");
            }
    
            public User GetUser(int i)
            {
                Console.WriteLine("AccessUserList");
                return null;
            }
        }

    定义一个工厂接口

    //工厂接口
        interface IFactory
        {
            //继承类可以根据不同的需求产生不同的User对象
            IUser CreateUser();
        }

    具体的工厂,根据不同的需求,产生不同的User对象

    //Sql数据库工厂
        public class SqlFactory : IFactory
        {
            //访问Sql数据库的User对象
            public IUser CreateUser()
            {
                return new SqlUser();
            }
        }
    
    //Access数据库工厂
        public class AccessFactory : IFactory
        {
            //访问Access数据库的User对象
            public IUser CreateUser()
            {
                return new AccessUser();
            }
        }

    客户端实现

    public static void Main(string[] args)
            {
                User user = new User();
                //根据不同需求实例化不同数据库的工厂对象
                IFactory factory = new AccessFactory();
                //完成业务逻辑和数据库访问的解耦,iu对象不必知道具体产生的是哪个数据库的对象
                IUser iu = factory.CreateUser();
                iu.Insert(user);
                iu.GetUser(1);
            }

    UML 类图

    工厂方法模式

    工厂方法模式是简单工厂模式的延伸,首先定义一个用于创建对象的接口,然后产生子类,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

    工厂方法模式实现时,客户端需要决定实例化哪一个具体工厂,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你想要加功能,本来是改工厂类的,而现在是修改客户端。

    工厂方法模式的优缺点

    优点:客服了简单工厂违背开放-封闭的原则,又保持了封装对象创建过程的优点。
    缺点:每加增加一个产品,就要增加具体的产品工厂类,加大了开发量

    本文根据《大话设计模式》整理得出

  • 相关阅读:
    zbb20180929 dubbo+zookeeper
    zbb20180929 Linux高可用之Keepalived
    zbb20180929 zk Zookeeper的功能以及工作原理
    zbb20180927 Union与Union All的区别
    zbb20180927 MySQL MyISAM InnoDB区别
    zbb20180921 spring事物的七种事物传播属性行为及五种隔离级别
    zbb20180921 java,md5,MD5加密+加盐
    zbb20180921 java,js,javascript 前端加密后端解密Base64通用加密处理
    zbb20180921 springboot 全局异常处理 404 500
    zbb20180919 db,mysql MySQL慢查询
  • 原文地址:https://www.cnblogs.com/adzhouyang/p/7398000.html
Copyright © 2011-2022 走看看