设计模式 | 工厂方法模式
时间:2022-07-22
本文章向大家介绍设计模式 | 工厂方法模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
说明
这个设计模式属于创建型, 也是常用设计模式之一, 工厂模式分为: 简单工厂、工厂方法、静态工厂、抽象工厂
我们这篇主要介绍工厂方法模式, 工厂方法就是为了解决简单工厂扩展性的问题,相信大家再看简单工厂是也发现了其缺陷,以前简单工厂要扩展的时候,需要修改工厂内容,这就违背了设计模式对外扩展开放,对内修改关闭原则
- 应用场景
- 当你不知道该使用对象的确切类型的时候 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
- 当你希望为库或者框架提供扩展其内部组件的方法时
- 主要优点
- 解耦
- 符合原则
- 主要组成
- 抽象工厂接口
- 工厂接口的实现
- 抽象产品
- 具体产品
示例
- 多种数据库操作使用工厂方法实现
<?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();
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Leetcode 121. 买卖股票的最佳时机 (DP,模拟)
- MQ 系列之初识消息中间件
- Leetcode 第23场双周赛C 5361. 圆和矩形是否有重叠 (计算几何 初中数学)
- vue-cli 4 快速构建一个 Vue 项目
- SpringDataJPA 系列之快速入门
- Leetcode 第23场双周赛B 5362. 构造 K 个回文字符串(map,思维)
- Java 水题系列(1)数字金字塔
- Leetcode 836. 矩形重叠
- 详解 Vue 目录及配置文件之 config 目录
- Nginx 搭建静态资源服务
- vue 使用自定义字体
- vue 跨域问题
- Shell 递归查找文件
- element-ui 实现嵌套表格
- Leetcode 第23场双周赛A 5360. 统计最大组的数目 (手速题,map)