结合项目实例 回顾传统设计模式(四)工厂模式(简单工厂、普通工厂、抽象工厂)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

关于工厂模式和单例模式  大部分项目这2种模式都很常见

例如在orm框架中 工厂模式常用来封装数据库的创建 我们分3种case来看 简单工厂模式 普通工厂模式 抽象工厂模式

 抽象一点的说 工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。直接看实例

一般惯性思维 我们遇到分支判断时会这样

  public  class NormalCase
    {
         private DBInstance dbInstance;
         public NormalCase( string type)
        {
               if (type.Equals( " SQL "))
            {
                dbInstance=   new SqlInstance();
            }
             else  if (type.Equals( " Oracle "))
            {
                dbInstance =  new OracleInstance();
            }
             else  if (type.Equals( " Mysql "))
            {
                dbInstance =  new MysqlInstance();
            }
        }
         public  void ExecuteNonQuery()
        {
             this.dbInstance.ExecuteNonQuery();
        }
         public  void ExecuteDataset()
        {
             this.dbInstance.ExecuteDataset();
        }
    }

那么 new有什么不好,在技术上new没什么错,但是好的设计针对扩展开放而对修改关闭。

针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。如果代码是针对接口编写,那么通过多态,它可以与任何新类实现该接口。

下面让我们看看工厂模式如何解决该问题

先来看看简单工厂

 

public  class SimpleFactory
    {
         public DBInstance createinstance( string type)
        {
            DBInstance di =  null;
             if (type.Equals( " SQL "))
            {
                 return  new SqlInstance();
            }
             else  if (type.Equals( " Oracle "))
            {
                 return  new OracleInstance();
            }
             else  if (type.Equals( " Mysql "))
            {
                 return  new MysqlInstance();
            }
             return di;
            
        }
    }

     public  class SimpleCase
    {
        SimpleFactory facotory;
        DBInstance di;
         public SimpleCase(SimpleFactory facotory)
        {
             this.facotory = facotory;
        }
         public DBInstance CreateInstance( string type)
        {            
             di = facotory.createinstance(type);
              return di;

        }
         public  void ExecuteNonQuery()
        {
             this.di.ExecuteNonQuery();
        }
         public  void ExecuteDataset()
        {
             this.di.ExecuteDataset();
        }

    }

 

准确来说,简单工厂并不是一种设计模式,反而比较像是一种编程习惯。上述case只是把问题从一个对象搬到另一个对象中,问题依然存在。但是SimpleFactory可以有许多客户,把创建实例的代码包装进一个类,当以后实现改变时,只需修改这个类就可以了。物品们也正要把具体实例化的过程从客户的代码中删除。

下面我就来介绍下两个重量级的模式!

工厂方法模式

public  abstract  class facotoryCase
    {
        DBInstance di;
         public DBInstance CreateInstance( string type)
        {          
            di = create(type);
             return di;
        }
        public  abstract DBInstance create( string type);

        public  void ExecuteNonQuery()
       {
            this.di.ExecuteNonQuery();
       }
        public  void ExecuteDataset()
       {
            this.di.ExecuteDataset();
       }
    }

     public  class facotoryCaseA : facotoryCase
    {
         public  override DBInstance create( string type)
        {
             if (type.Equals( " SQL "))
            {
                 return  new SqlInstance();
            }
             else  if (type.Equals( " Oracle "))
            {
                 return  new OracleInstance();
            }
             return  null;
        }
    }

     public  class facotoryCaseB : facotoryCase
    {
         public  override DBInstance create( string type)
        {
             if (type.Equals( " Mysql "))
            {
                 return  new MysqlInstance();
            }          
             return  null;
        }
    }

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

设计原则:要依赖抽象不要依赖具体类。

接下来再看下抽象工厂模式

public  class Param { }
     public  class sqlparm : Param { }
     public  class oracleparam : Param { }
     public  class connection { }
     public  class sqlconnecttion : connection { }
     public  class oracleconnecttion : connection { }


     public  interface abstractCase
    {
        Param GetParameter();
        connection GetConnection();
    }

     public  abstract  class DBInstanceforabstract
    {
         public Param p;
         public connection c;
         public  abstract  void ExecuteNonQuery();
         public  abstract  void ExecuteDataset();
    }

     public  class DBInstanceforabstractA : DBInstanceforabstract
    {
        abstractCase ac;
         public DBInstanceforabstractA(abstractCase ac)
        {
             this.ac = ac;
        }
         public  override  void ExecuteNonQuery()
        {
            p = ac.GetParameter();         
        }
         public  override  void ExecuteDataset()
        {
            c = ac.GetConnection();
          
        }
         
    }

     public  class abstractCaseA : abstractCase
    {
        DBInstanceforabstract di;
         public Param GetParameter()
        {
             return  new sqlparm();
        }
         public connection GetConnection()
        {
             return  new sqlconnecttion();
        }
    }

     public  class abstractCaseB : abstractCase
    {
        DBInstanceforabstract di;
         public Param GetParameter()
        {
             return  new oracleparam();
        }
         public connection GetConnection()
        {
             return  new oracleconnecttion();
        }
    }

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族而不需要明确指定具体类。


本文转自 熬夜的虫子  51CTO博客,原文链接:http://blog.51cto.com/dubing/712407


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
设计模式
设计模式之抽象工厂
设计模式之抽象工厂
|
3月前
|
设计模式 Java
常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)
有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式)
38 2
|
3月前
|
设计模式 Java
设计模式之工厂
设计模式之工厂
|
3月前
|
设计模式
设计模式-抽象工厂
设计模式-抽象工厂
|
7天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
3月前
|
设计模式
设计模式-简单工厂和工厂方法
设计模式-简单工厂和工厂方法
|
6月前
|
设计模式 架构师
设计模式之抽象工厂
设计模式之抽象工厂
|
25天前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
21 1
|
2月前
|
设计模式 Java 关系型数据库
Java设计模式--创建模式工厂--用披萨订购案例 详细讲解三种工厂模式
Java设计模式--创建模式工厂--用披萨订购案例 详细讲解三种工厂模式
48 1
|
3月前
|
设计模式 Java 数据库连接
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。那么三者有什么区别呢?
99 1
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别