工厂模式,顾名思义,如同工厂一样,你把原材料放入工厂中,出来的是成品,而你并不需要知道工厂里做了什么,工厂模式主要用于解耦。个人认为设计模式只能在实战中更好的理解,当前水平有限,欢迎大家交流

简单工厂模式

把对象的创建和使用的过程分开,比如: ClassA 调用 ClassB,那么 ClassA 只调用ClassB 的方法,至于实例化 ClassB 则在工厂内实现。这样既减少了代码的重复使用,也方便对 ClassB de 后期维护。如果 ClassB 实例化过程很复杂,使用简单工厂模式就会发现外部无需关注复杂的实例化,只管调用 ClassB 的方法即可,减少错误

<?php
namespace Factory\SimpleFactory; class SimpleFactory
{
public function createProduction(): Production
{
return new Production();
}
} class Production
{
public function getPrice(int $price)
{
return $price * 2;
}
} class Test
{
public function __construct()
{
$factory = new SimpleFactory();
$production = $factory->createProduction(); if ($production instanceof Production) {
echo 'Nice';
}
}
}

工厂方法模式

主要用于限制类的公用方法

<?php

namespace Factory\SimpleFactory;

/**
* Interface FunctionFactory
* @package Factory\SimpleFactory
*/
interface FunctionFactory
{
/**
* @param array $data
* @return array
*/
public function create(array $data); /**
* @param int $id
* @return bool
*/
public function delete(int $id); /**
* @param array $data
* @return array
*/
public function update(array $data); /**
* @return array
*/
public function select();
} class ProductionRepository implements FunctionFactory
{
public function create(array $data)
{
// TODO: Implement create() method.
} public function delete(int $id)
{
// TODO: Implement delete() method.
} public function update(array $data)
{
// TODO: Implement update() method.
} public function select()
{
// TODO: Implement select() method.
}
}

抽象工厂模式

抽象工厂模式 = 工厂方法模式+简易工厂模式

<?php

namespace Factory\SimpleFactory;

/**
* Class AbstractFactory
* @package Factory\SimpleFactory
*/
class AbstractFactory
{
/**
* @param int $price
* @param int $discount
* @return PromotionPhoneProduct
*/
public function createPromotionPhoneProduct(int $price, int $discount)
{
return new PromotionPhoneProduct($price, $discount);
} /**
* @param int $price
* @return PhoneProduct
*/
public function createPhoneProduct(int $price)
{
return new PhoneProduct($price);
}
} /**
* Interface Product
* @package Factory\SimpleFactory
*/
interface Product
{
/**
* @return int
*/
public function calculatePrice(): int;
} /**
* Class PhoneProduct
* @package Factory\SimpleFactory
*/
class PromotionPhoneProduct implements Product
{
/**
* @var int
*/
private $price; /**
* @var int
*/
private $discount; /**
* PhoneProduct constructor.
* @param int $price
* @param int $discount
*/
public function __construct(int $price, int $discount)
{
$this->price = $price;
$this->discount = $discount;
} /**
* @return int
*/
public function calculatePrice(): int
{
return $this->price * $this->discount;
}
} /**
* Class PhoneProduct
* @package Factory\SimpleFactory
*/
class PhoneProduct implements Product
{
/**
* @var int
*/
private $price; /**
* PhoneProduct constructor.
* @param int $price
* @param
*/
public function __construct(int $price)
{
$this->price = $price;
} /**
* @return int
*/
public function calculatePrice(): int
{
return $this->price;
}
}

静态工厂方法

静态方法主要用于构建相同类型的对象

<?php

namespace Factory\SimpleFactory;

/**
* Class StaticFactory
* @package Factory\SimpleFactory
*/
class StaticFactory
{
/**
* @param string $type
* @return NumericClass|StringClass
*/
public static function build(string $type)
{
switch ($type) {
case 'string':
return new StringClass();
break;
case 'numeric':
return new NumericClass();
default:
break;
}
}
} /**
* Interface TypeInterface
* @package Factory\SimpleFactory
*/
interface TypeInterface
{
/**
* @return mixed
*/
public function getType();
} /**
* Class NumericClass
* @package Factory\SimpleFactory
*/
class NumericClass implements TypeInterface
{
/**
* @return mixed|void
*/
public function getType()
{
// TODO: Implement getType() method.
}
} /**
* Class StringClass
* @package Factory\SimpleFactory
*/
class StringClass implements TypeInterface
{
/**
* @return mixed|void
*/
public function getType()
{
// TODO: Implement getType() method.
}
}

四种工厂模式的优缺点

待补充

PHP 工厂模式介绍的更多相关文章

  1. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  2. java_设计模式_工厂模式_Factory Pattern(2016-08-04)

    工厂模式主要是为创建对象提供了接口.工厂模式按照<Java与模式>中的提法分为三类: (1)简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory ...

  3. 设计模式C++实现(1)——工厂模式

    该文章转载自: http://blog.csdn.net/wuzhekai1985 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装 ...

  4. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  5. 浅析JavaScript工厂模式

    这里主要介绍两种工厂模式,第一种“简单工厂模式”,第二种“工厂方法模式” 简单工厂模式 1.定义 由一个工厂对象决定对象创建某一种产品对象的的实例.主要用来创建同一类对象. 2.具体需求 现在有一个登 ...

  6. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  7. C#设计模式(3)——抽象工厂模式

    1.抽象工厂模式介绍 上一篇我们了解了工厂模式,知道工厂模式可以解决简单工厂的缺陷(简单工厂添加新产品时要修改工厂类,不符合开闭原则),但是简单工厂和工厂模式都是只生产一种产品(前边的简单工厂和工厂都 ...

  8. C#设计模式(2)——工厂模式

    1.工厂模式介绍 上一篇我们知道了简单工厂的缺点是:当我们添加一个新的产品时需要修改工厂类,这样就违背了开闭原则.工厂模式就是为了解决这一缺陷而出现的,解决的方法是把创建具体实例的任务放在了工厂的子类 ...

  9. JavaScript设计模式—工厂模式

    工厂模式介绍 将new操作符单独进行封装,遇到new时,就要考虑是否该使用工厂模式 举一个生活当中的示例: 你要去购买汉堡,直接点餐,取餐,不会自己动手做,商店要“封装” 做汉堡的工作,做好直接给购买 ...

随机推荐

  1. bzoj 3732: Network 树上两点边权最值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3732 首先想到,要使得最长边最短,应该尽量走最短的边,在MST上. 然后像LCA那样倍增娶个最大值 ...

  2. 解决Spring JdbcTemplate调用queryForObject()方法结果集为空时报异常

    JdbcTemplate用的时候发现一个问题:调用queryForObject()方法,如果没有查到东西则会抛一个异常:org.springframework.dao.EmptyResultDataA ...

  3. 记一次序列化的JSON解析问题

    目录 一.问题初探 二.问题原因 三.解决问题 一.问题初探 我今天在使用Ribbon 远程调用的时候 消费者去消费服务端所提供的服务,在使用Post请求中的PostForEntity传递参数的时候, ...

  4. vuex文档(附加个人理解)

    Vuex是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到Vue 的 ...

  5. ASP.NET MVC CheckBoxFor为什么会生成hidden input控件

    自己开发的公众号,可以领取淘宝内部优惠券 @Html.CheckBoxFor(m => m.Bool) 使用CheckBoxFor方法得到的html代码会是下面这个样子 <input ch ...

  6. GCC的内存边界对齐

      GCC有三种影响内存对齐的开关:           首先是命令行参数 –fpack_struct=n (n只可以是1,2,4,8等2的幂,而且要小于平台默认的对齐字节数,否则不会生效)      ...

  7. Swift网络库Alamofire的导入

    一.手动导入 1, 官网下载 Alamofire 2, 解压下载的文件 放入工程的顶层目录下 3, 打开工程 Add Files 4, 选中项目 TARGETS > General > E ...

  8. Web 前端安装依赖的时候遇到的问题

  9. vue 导出excel

    1.安装三个依赖包 npm install -S file-saver npm install -S xlsx npm install -D script-loader 2.在项目中创建一个文件夹(比 ...

  10. linux 解决 gvfsd-smb-browse CPU 100%占用

    原文地址:https://bugzilla.redhat.com/show_bug.cgi?id=1303300 1: sudo vim /etc/samba/smb.conf 2:定位到[globa ...