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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介:

关于工厂模式和单例模式  大部分项目这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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
10月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
设计模式 Java
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
429 2
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
265 4
|
设计模式 关系型数据库
「全网最细 + 实战源码案例」设计模式——简单工厂模式
简单工厂模式是一种创建型设计模式,通过工厂类根据传入参数创建不同类型的对象,也称“静态工厂方法”模式。其结构包括工厂类、产品接口和具体产品类。优点是封装性强、代码复用性好;缺点是扩展性差,增加新产品时需修改工厂类代码,违反开闭原则。适用于对象种类较少且调用者无需关心创建细节的场景。
286 19
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
272 2
|
10月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
296 16
|
10月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
291 0
|
10月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
359 0

热门文章

最新文章