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

简单工厂模式

把对象的创建和使用的过程分开,比如: 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. java实现的各种hash加密

    public class jiami { public static void main(String args[]){ String signString="Thank you!" ...

  2. Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API

    用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...

  3. Oracle11G的用户解锁、卸载以及基础操作

    Oracle用户解锁 [以下操作,必须以超级管理员身份登录,才能修改]oracle安装后,会默认生成很多个用户 以超级管理员身份登录,请注意,其中的空格符:[ sys是一个超级管理员,有最大的权限,d ...

  4. DB2去重的几种方法

    有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略. 例如下表:table1 用户办理套餐的记 ...

  5. JQuery基础知识==认识JQuery

    jQuery API 中文文档:https://www.jquery123.com/ jQuery Mobile 菜鸟教程:http://www.runoob.com/jquerymobile/jqu ...

  6. java(itext) 一个很简单的PDF表格生成工具

    先上个效果图 因为做的项目涉及到数据预测,其中有大量打印业务来支撑实体店的运营,因为注重的是数据,要求简洁,清晰,所以写了个很简单也很实用的工具类. 如果需要编写样式或者插入背景,都可以查阅itex官 ...

  7. 从零开始的全栈工程师——js篇2.5

    数据类型与全局属性 js的本质就是处理数据 数据来自于后台的数据库所以变量就起到一个临时存储数据的这作用ECMAscirpt 制定了js的数据类型 一.数据类型 1.基本数据类型 基本数据类型就是简单 ...

  8. 原生js添加类名,删除类名

    1.添加类名: document.getElementById("myDiv").classList.add('mystyle'); 2.删除类名: document.getEle ...

  9. 利用expect实现自动化操作

    管理机上需要安装expect包 yum -y install expect 1.定义主机ip [root@localhost ~]# cat ip.txt 192.168.1.12 192.168.1 ...

  10. hihoCoder 挑战赛10 #1144 : 01串

    思路:这只是逻辑测试题吧,考虑周全就行了.考虑n=m的情况,n>m的情况,m>n的情况. (1)n>m的情况,0比1多几个都是行的,一共有m个“01”,后面补足够多个零即可. (2) ...