zoukankan      html  css  js  c++  java
  • 不一样的抽象工厂模式(设计模式七)

    前言

    工厂模式解决了对象创建导致的紧耦合的关系,从而支持对象创建的稳定。那么抽象工厂是解决什么问题呢?

    我们知道要松耦合高内聚,那么什么时候需要高内聚呢?高内聚解决什么问题呢?

    在软件系统中,经常面临着"一系列相互依赖对象"的创建工作。同时由于需求的变化,往往存在更多系列的创建工作呢?

    正文

    在我们数据库访问中,我们常常用到SqlConnection、SqlCommand、SqlDataReader,这是mmsql,但是有一个问题,这个是我们在使用不同数据库的时候呢,我们要切换不同对象,假设MySqlConnection、MySqlCommand、MySqlDataReader。

    这样我们又得去修改代码,这是因为new SqlConnection 是具体实现,所以我们使用工厂模式来解决这个问题。

    DBCommandFactory dBCommand;
    DBConnectionFactory dBConnection;
    DBDataReaderFactory dBDataReader;
    public Application(DBConnectionFactory dBConnection, DBCommandFactory dBCommand, DBDataReaderFactory dBDataReader)
    {
    	this.dBCommand = dBCommand;
    	this.dBConnection = dBConnection;
    	this.dBDataReader = dBDataReader;
    }
    
    public void doSomeThing()
    { 
       //做一些操作
    }
    

    放出其他代码:

    public interface IDBConnection
    {
    
    }
    
    public abstract class DBConnectionFactory
    {
    	public abstract IDBConnection CreateDBConnection();
    }
    
    public interface IDBCommand
    {
    
    }
    
    public abstract class DBCommandFactory
    {
    	public abstract IDBCommand CreateDBCommand();
    }
    
    public interface IDBDataReader
    {
    
    }
    
    public abstract class DBDataReaderFactory
    {
    	public abstract IDBDataReader CreateDBDataReader();
    }
    
    public class SqlConnection : IDBConnection
    {
    
    }
    
    public class SqlConnectionFactory : DBConnectionFactory
    {
    	public override IDBConnection CreateDBConnection()
    	{
    		return new SqlConnection();
    	}
    }
    
    public class SqlCommand : IDBCommand
    {
    
    }
    
    public class SqlCommandFactory : DBCommandFactory
    {
    	public override IDBCommand CreateDBCommand()
    	{
    		return new SqlCommand();
    	}
    }
    
    public class SqlDataReader : IDBDataReader
    {
    
    }
    
    public class SqlDataReaderFactory : DBDataReaderFactory
    {
    	public override IDBDataReader CreateDBDataReader()
    	{
    		return new SqlDataReader();
    	}
    }
    
    public class MySqlConnection : IDBConnection
    {
    
    }
    
    public class MySqlCommand : IDBCommand
    {
    
    }
    
    public class MysqlDataReader : IDBCommand
    {
    
    }
    //mysql 的工厂我没有写
    

    那么这个时候有啥问题呢?

    DBCommandFactory dBCommand;
    DBConnectionFactory dBConnection;
    DBDataReaderFactory dBDataReader;
    public Application(DBConnectionFactory dBConnection, DBCommandFactory dBCommand, DBDataReaderFactory dBDataReader)
    {
    	this.dBCommand = dBCommand;
    	this.dBConnection = dBConnection;
    	this.dBDataReader = dBDataReader;
    }
    

    看上面代码,有一个问题就DBConnectionFactory 如果是mmsql,那么DBCommandFactory 、DBDataReaderFactory 同样要是这样。

    那么就可以做一个这样的变化,这时候就是要高内聚。

    public class Application
    {
    	DBFactory dBFactory;
    	public Application(DBFactory dBFactory)
    	{
    		this.dBFactory = dBFactory;
    	}
    
    	public void doSomeThing()
    	{
    		dBFactory.CreateDBCommand();
    		dBFactory.CreateDBConnection();
    		dBFactory.CreateDBDataReader();
    	}
    }
    

    这里只放出mmsql 的代码:

    public interface IDBConnection
    {
    
    }
    public interface IDBCommand
    {
    
    }
    
    public interface IDBDataReader
    {
    
    }
    
    public abstract class DBFactory
    {
    	public abstract IDBConnection CreateDBConnection();
    	public abstract IDBCommand CreateDBCommand();
    	public abstract IDBDataReader CreateDBDataReader();
    }
    
    public abstract class DBDataReaderFactory
    {
    	
    }
    
    public class SqlConnection : IDBConnection
    {
    
    }
    
    public class SqlCommand : IDBCommand
    {
    
    }
    
    
    public class SqlDataReader : IDBDataReader
    {
    
    }
    
    public class SqlConnectionFactory : DBFactory
    {
    	public override IDBCommand CreateDBCommand()
    	{
    		return new SqlCommand();
    	}
    
    	public override IDBConnection CreateDBConnection()
    	{
    		return new SqlConnection();
    	}
    
    	public override IDBDataReader CreateDBDataReader()
    	{
    		throw new NotImplementedException();
    	}
    }
    

    概念图

    后续补上

  • 相关阅读:
    Jenkins 集成Sonar scanner的使用案例
    Sonarqube 安装 及与Jenkins sonar scanner插件集成部署
    shell if 判断匹配1位数字
    使用tcpdump抓包
    golang + snap7 对西门子plc进行读写
    python基础练习题(题目 求输入数字的平方,如果平方运算后小于 50 则退出)
    python基础练习题(题目 统计 1 到 100 之和)
    python基础练习题(题目 使用lambda来创建匿名函数。)
    微服务状态之python巡查脚本开发
    python基础练习题(题目 计算两个矩阵相加)
  • 原文地址:https://www.cnblogs.com/aoximin/p/13587684.html
Copyright © 2011-2022 走看看