引言
 
  所属:创建型模式,常用设计模式之一
  工厂模式分为:简单工厂模式、工厂方法模式、静态工厂模式、抽象工厂模式。
  下面为简单工厂模式。
   参考资料:
    • 《大话设计模式》程杰
 
模式概述
 
  简单工厂模式是由一个工厂类决定创建出哪一种产品类的实例
  
  其中有两个关键字,工厂类、产品类。
 
  下面举个例子解释这两个关键词。
 
举个栗子
 
    程序代码中应用缓存,暂时考虑用Memcached,之后可能会换Redis,程序如何设计。
  
    解决的问题:
      
      假设程序设计使用Memcached,每一次的代码肯定是 new Memcaced ; 如果因为项目扩展要更换为Redis,必然很多代码都要改。
 
    流程图如下:
      
          

    
    产品类:其中Memcached和Redis是产品类,暂时举例两个产品类,可能会有很多个。

    工厂类:声明一个公共类,由该类指定使用哪个产品,这样就不需要改动【调用层】代码内容。

    看到这个图是不是对关键词清晰很多了。

    我们要做什么:

      让工厂类【公共类】来选择调用哪个具体产品

    
程序设计代码:
 
入口文件:index.php
<?php
// 自动加载
spl_autoload_register(function ($class) {
$file = __DIR__ . '/' . $class . '.php';
require_once($file);
}); $mode = Cache::cacheMode('Redis'); // 调用工厂类(缓存公共类)
$mode->getName();

公共缓存文件 Cache.php

<?php
namespace factory; /**
* 缓存公共方法
**/
class Cache
{
public static function cacheMode($type)
{
switch ($type) {
case 'Redis':
return new RedisMode();
break;
case 'Memca';
return new MemcachedMode();
break;
default:
return false;
break;
}
}
}

Redis类:RedisMode.php

<?php

class RedisMode
{
public function getName()
{
echo '我是Redis';
}
}

Memcached类:MemcachedMode.php

<?php

class MemcachedMode
{
public function getName()
{
echo '我是Memcached';
}
}
 
以下为源码地址

  

  GitHub源码地址:https://github.com/xiaobaoword/design_pattern/tree/master

总结

  

  优点:

    1. 一个调用者想创建一个对象,只要知道其名称就可以了。

    2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

    3、屏蔽产品的具体实现,调用者只关心产品的接口。

  缺点:

    1. 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

    2. 违背了设计模式的原则【开放封闭】原则

      开放封闭:一个类,应该是可扩展的,而不可修改的。

  之后,工厂方法模式应运而生,请看下章。

「PHP」简单工厂模式的更多相关文章

  1. 「PHP」抽象工厂模式

    引言   所属:创建型模式,常用设计模式之一 参考资料: <大话设计模式>程杰   模式概述    官方定义:抽象工厂模式(Abstract Factory),提供一个创建一系列相关或互相 ...

  2. PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)

    最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...

  3. C#设计模式之简单工厂模式(Simple Factory)

    1. 概述 简单工厂模式就是将一个类的实例化交给一个静态工厂来执行. 2. 使用频率 中 3. 模式结构 3.1 机构图 3.2 模式中的角色 Product:抽象类,把具体产品类公共的代码进行抽象和 ...

  4. 设计模式 — 简单工厂模式(Simple Factory)

    定义:定义一个工厂类,它可以根据参数的不同返回不同类型的实例,被创建的实例通常有公共的父类. 模式类型:创建型模型 Factory(工厂角色):即工厂类,负责实现创建所有产品实例的内部逻辑:工厂类可以 ...

  5. C#设计模式(2)——简单工厂模式

    一.概念:简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创 ...

  6. 设计模式之简单工厂模式Simple Factory(四创建型)

    工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...

  7. 学习设计模式第二十七 - GoF之外简单工厂模式

    示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...

  8. Objective-C 工厂模式(上) -- 简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂 ...

  9. C#设计模式系列:简单工厂模式(Simple Factory)

    1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...

随机推荐

  1. 爬虫入门之Scrapy 框架基础功能(九)

    Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非 ...

  2. windows下安装配置RabbitMQ

    安装部署 1.当前环境以及参考资料出处 部署环境:windows server 2008 r2 enterprise 官方安装部署文档:http://www.rabbitmq.com/install- ...

  3. 使用UIScreenEdgePanGestureRecognizer写iOS7侧边栏

    使用UIScreenEdgePanGestureRecognizer写iOS7侧边栏 A UIScreenEdgePanGestureRecognizer looks for panning (dra ...

  4. 安装或删除Skype for business server组件的时候,报错"错误: 找不到 SQL 服务"

    安装或删除Skype for business server组件的时候,到了安装所有并置数据库的时候,报错“错误: 找不到 SQL 服务.确保计算机 skype.centos.com 中安装了 SQL ...

  5. 对于char *s1 和 char s2[] 的认识

    对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误. char *s1 = "hello"; char s2[] = " ...

  6. SAP C/4HANA Sales Cloud使用OData服务和第三方系统集成的一个具体例子

    出于工作需要,Jerry写了这篇文章,给某些Partner做参考. 以前Jerry曾经介绍过SAP C/4HANA的五朵云到底包含哪些具体产品,其实在SAP官网上有更权威的中文解释: https:// ...

  7. Python列表生成式(入门9)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6407984.html 本文出自:[Edwin博客园] Python列表生成式 1. 生成列表 L = [] ...

  8. Webpack笔记(三)——一款破产版脚手架的开发

    前些天一直在学习入门Webpack,后来尝试了自己搭建一下一个简单的React开发环境,后来就在想可不可以自己写一个简单的脚手架,以免每次搭建一个简单的开发环境都需要自己一个个的配置,这样很麻烦,使用 ...

  9. Codeforces Round #434 (Div. 2)【A、B、C、D】

    Codeforces Round #434 (Div. 2) codeforces 858A. k-rounding[水] 题意:已知n和k,求n的最小倍数x,要求x后缀至少有k个0. 题解:答案就是 ...

  10. mysqlslap执行基准测试

    查看mysqlslap所支持的主要参数配置及说明如下 -a, --auto-generate-sql 由系统自动生成SQL脚本进行测试 Generate SQL where not supplied ...