php 设计模式之工厂模式

简介:

在开发大型系统过程中,往往会出现这样一种情况:

我有一部分基础数据,是类classA是从数据库A读取出来的,其他很多的功能都是基于这个基础数据来操作的。现在呢,我想把数据从数据库A变成从另外的数据源去获取,这时候,要修改起来就比较麻烦,要修改其他很多类的代码。这种设计显然是不够灵活的,换句话说,就是紧耦合的,系统中某个部分的函数或类严重依赖于系统的其他部分中的函数或类的行为和结构。

工厂模式,就是解决这样的一些情况的设计方法。工厂模式是一种类,建立了一个工厂来根据所需来创建对象,这种方式在多态性编程中是很重要的,允许动态替换类修改配置等。

工厂模式分为:简单工厂模式工厂方法模式抽象工厂模式

简单工厂模式,通过静态方法创建对象。可以理解成,只负责生产同一等级结构中的任何一个产品,但是不能新增产品。

工厂方法模式,去掉了简单工厂模式中方法的静态属性,使其可以被子类集成,定义一个创建对象的接口,让子类去决定实例化哪个类。可以理解成,用来生产同一等级结构中的固定产品,但是支持增加产品。

抽象工厂模式,提供一个创建一系列相关或者相互依赖的对象的接口。可以理解成,用来生产不用类型的全部产品,但是不能增加新品,支持增加新的类型。

简单工厂方法:自己根据自己传过去的参数获得自己想要的东西。其实便于代码的复用。

代码:

 <?php
/**
* 基本工厂模式
* */
class User {
private $username;
public function __construct($username) {
$this->username = $username;
} public function getUser() {
return $this->username;
}
} class userFactory {
static public function createUser() {
return new User('Jack');
}
} $user = userFactory::createUser();echo $user->getUser(); /**
*简单工厂模式
* */
interface userProperties {
function getUsername();
function getGender();
function getJob();
}
class User implements userProperties{
private $username;
private $gender;
private $job;
public function __construct($username, $gender, $job) {
$this->username = $username;
$this->gender = $gender;
$this->job = $job;
} public function getUsername() {
return $this->username;
} public function getGender() {
return $this->gender;
} public function getJob() {
return $this->job;
}
} class userFactory {
static public function createUser($properties = []) {
return new User($properties['username'], $properties['gender'], $properties['job']);
}
} $employers = [
['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
];
$user = userFactory::createUser($employers[0]);
echo $user->getUsername(); /**
* 工厂方法模式
**/
interface userProperties {
function getUsername();
function getGender();
function getJob();
} interface createUser {
function create($properties);
} class User implements userProperties{
private $username;
private $gender;
private $job;
public function __construct($username, $gender, $job) {
$this->username = $username;
$this->gender = $gender;
$this->job = $job;
} public function getUsername() {
return $this->username;
} public function getGender() {
return $this->gender;
} public function getJob() {
return $this->job;
}
} class userFactory {
private $user;
public function __construct($properties = []) {
$this->user = new User($properties['username'], $properties['gender'], $properties['job']);
} public function getUser() {
return $this->user;
}
} class FactoryMan implements createUser {
function create($properties) {
return new userFactory($properties);
}
} class FactoryWoman implements createUser {
function create($properties) {
return new userFactory($properties);
}
} class clientUser {
static public function getClient($properties) {
$fac = new FactoryMan;
$man = $fac->create($properties);
echo $man->getUser()->getUsername();
}
} $employers = [
['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
];
$user = clientUser::getClient($employers[0]); /**
* 抽象工厂模式
* */ interface userProperties {
function getUsername();
function getGender();
function getJob();
} interface createUser { //将对象的创建抽象成一个接口
function createOpen($properties);//内向创建
function createIntro($properties);//外向创建
} class User implements userProperties{
private $username;
private $gender;
private $job;
public function __construct($username, $gender, $job) {
$this->username = $username;
$this->gender = $gender;
$this->job = $job;
} public function getUsername() {
return $this->username;
} public function getGender() {
return $this->gender;
} public function getJob() {
return $this->job;
}
} class userFactory {
private $user;
public function __construct($properties = []) {
$this->user = new User($properties['username'], $properties['gender'], $properties['job']);
} public function getUser() {
return $this->user;
}
} class FactoryMan implements createUser {
function createOpen($properties) {
return new userFactory($properties);
} function createIntro($properties) {
return new userFactory($properties);
}
} class FactoryWoman implements createUser {
function createOpen($properties) {
return new userFactory($properties);
} function createIntro($properties) {
return new userFactory($properties);
}
} class clientUser {
static public function getClient($properties) {
$fac = new FactoryMan;
$man = $fac->createOpen($properties);
echo $man->getUser()->getUsername();
}
} $employers = [
['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
];
$user = clientUser::getClient($employers[0]);

php 设计模式之工厂模式的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  5. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  6. php设计模式:工厂模式

    php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. java 设计模式之工厂模式与反射的结合

    工厂模式: /**  * @author Rollen-Holt 设计模式之 工厂模式  */   interface fruit{     public abstract void eat(); } ...

  9. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  10. [JS设计模式]:工厂模式(3)

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

随机推荐

  1. 痛苦的人生——JRuby on Rails的开发与部署小记

    最近单位领导部署了一项开发用户自助服务系统的任务,该任务有且仅有我一人独立完成——哈哈,十分美妙的工作呢. 恰巧楼主最近被Ruby的美妙特性所迷惑,于是义无反顾地投入到Ruby on Rails的怀抱 ...

  2. P1233 木棍加工

    P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...

  3. 英语发音规则---V字母

    英语发音规则---V字母 一.总结 一句话总结: 1.V发[v]? voice [vɒɪs] n. 声音 love [lʌv] n. 恋爱 leave [liːv] vt. 离开 very ['ver ...

  4. 由mitab学到一些关于编译和运行的理解

    今天上午在鼓捣一个地图绘图程序,程序写到一半,在windows下写不下去了,原因是需要引入的第三方的mitab类库进行.mif文件的读写操作,而这个类库的windows下的.lib文件和.dll文件都 ...

  5. Linux 安装Redis 5.0

    结构如下: Redis 官方不建议Redis安装在WINDOWS 服务器上(尤其是生产中分布式事物缓存). linux 下Redis 5.0主从复制(一主二从)哨兵模式的搭建:https://www. ...

  6. Linux top命令简解

    简介: top 命令是最流行的性能监视工具之一,它是一个优秀的交互式工具,用于监视性能.它提供系统整体性能,但报告进程信息才是 top 命令的长处. top 界面分为两个部份,光标上面部份显示关于系统 ...

  7. js判断PC端与移动端跳转

    在网上看到很多这样类似的代码,但是有的很复杂,或者有的没有判断完全,上次经理去见完客户回来讲,使用苹果浏览打开pc端(pc已经做了识别跳转)会自动跳转到移动端的网页去,后来经测试才发现 documen ...

  8. Java回忆录之英勇黄铜V

    说实话最近心好累,就因为一个混合app开发贼简单的一个功能.我本以为很简单,做起来却发现需要很多知识面.麻雀虽小五脏俱全,即使再小的一个功能实现起来也需要很全面的知识来担保.要想盖高楼大厦啊必定要有坚 ...

  9. RabbitMQ学习笔记(2)----RabbitMQ简单队列(Hello World)的使用

    1. 简单队列结构图 2. 引入依赖 pom.xml文件 <dependency> <groupId>com.rabbitmq</groupId> <arti ...

  10. Django框架详解之template

    模板简介 将页面的设计和python的代码分离开会更干净简洁更容易维护.我们可以使用Django的模板系统来实现这种模式 python的模板:HTML代码+模板语法 模板包括在使用时会被值替换掉的变量 ...