设计模式 | 工厂方法模式

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 设计模式 | 工厂方法模式

说明

这个设计模式属于创建型, 也是常用设计模式之一, 工厂模式分为: 简单工厂、工厂方法、静态工厂、抽象工厂

我们这篇主要介绍工厂方法模式, 工厂方法就是为了解决简单工厂扩展性的问题,相信大家再看简单工厂是也发现了其缺陷,以前简单工厂要扩展的时候,需要修改工厂内容,这就违背了设计模式对外扩展开放,对内修改关闭原则

  • 应用场景
  1. 当你不知道该使用对象的确切类型的时候 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
  2. 当你希望为库或者框架提供扩展其内部组件的方法时
  • 主要优点
  1. 解耦
  2. 符合原则
  • 主要组成
  1. 抽象工厂接口
  2. 工厂接口的实现
  3. 抽象产品
  4. 具体产品

示例

  • 多种数据库操作使用工厂方法实现
<?php
/**
 * Created by 憧憬.
 */
/**
 * 定义基础数据库操作
 * Interface DataBase
 */
interface DataBase
{
    function connect();
    function first();
}
/**
 * Mysql操作
 * Class MySql
 */
class MySql implements DataBase
{
    function connect()
    {
        return "MySQL连接对象返回";
    }
    function first()
    {
        return "MySQL返回查询结果";
    }
}
/**
 * pgsql操作
 * Class PgSqlServer
 */
class PgSqlServer implements DataBase
{
    function connect()
    {
        return "Pgsql连接对象返回";
    }
    function first()
    {
        return "Pgsql返回查询结果";
    }
}
/**
 * 声明工厂约束
 * Interface FactoryDataBase
 */
interface FactoryDataBase{
    function createDataBase();
}
/**
 * mysql工厂实现
 * Class MySqlFactory
 */
class MySqlFactory implements FactoryDataBase
{
    public function createDataBase()
    {
        return new MySql();
    }
}
/**
 * pgsql工厂实现
 * Class SqlServerFactory
 */
class SqlServerFactory implements FactoryDataBase
{
    public function createDataBase()
    {
        return new PgSqlServer();
    }
}
/**
 * 这样做的话 对于增加新的连接没有任何影响,客户端无需感知, 例如我多增加一个oracle数据库的操作 使用者
 * 不需要知道这个东西如何创建, 而我们只需要声明好接口即可
 */
$server = new MySqlFactory();
$db = $server->createDataBase();
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
设计模式 安全 NoSQL
【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)
【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)
|
6天前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Combinator(功能模式)
【设计模式】JAVA Design Patterns——Combinator(功能模式)
|
6天前
|
设计模式 监控 Java
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
|
7天前
|
设计模式 Java 程序员
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
|
7天前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Builder(构造器模式)
【设计模式】JAVA Design Patterns——Builder(构造器模式)
|
7天前
|
设计模式 Java 容器
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
|
7天前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Aggregator Microservices(聚合器微服务模式)
【设计模式】JAVA Design Patterns——Aggregator Microservices(聚合器微服务模式)
|
2天前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
4天前
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)
|
6天前
|
设计模式 存储 Java
【设计模式】JAVA Design Patterns——Command(事务模式)
【设计模式】JAVA Design Patterns——Command(事务模式)