设计模式是程序员老司机长期积累下来的套路,我们在平时写代码的时候总是自己想怎么写就怎么写,完全没有一种套路或者范式,这会造成我们的代码混乱难以维护,套路就是让我们能够被其他程序员理解以及便于代码的扩展。同时也是让我们花式搬砖,而不是单调的搬砖。
工厂模式可以分为三类:
1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)
这里只分享简单工厂模式,等以后进一步学习另外两种模式。这里我们以简单的电商场景带入,我们卖书,狗,和酒。
简单工厂模式:用户不用去创建具体产品。因为客户有一个工厂来帮他创建产品.想要添加什么产品,这个工厂就可以建。比如想要狗。工厂就创建狗。即工厂可以创建产品。
1,产品类
有这样三个实体类:(这里我们返回数组代替我们向数据库查询数据)
Books:
<?php
class Books implements IProduct
{
function getList()
{
return [
["prod_id"=>101,"prod_name"=>"java从入门到住院"],
["prod_id"=>102,"prod_name"=>"php从精通到放弃"],
["prod_id"=>103,"prod_name"=>"黑客技术从入门到入狱"],
["prod_id"=>104,"prod_name"=>"python光速入门"],
["prod_id"=>105,"prod_name"=>"三小时学会golang"],
];
}
}
Dogs:
<?php
class Dogs implements IProduct
{
function getList()
{
return [
["prod_id"=>201,"prod_name"=>"斑点"],
["prod_id"=>202,"prod_name"=>"泰迪"],
["prod_id"=>203,"prod_name"=>"二哈"],
["prod_id"=>204,"prod_name"=>"金毛"],
["prod_id"=>205,"prod_name"=>"杂交"],
];
}
}
Wines:
<?php
class Wines implements IProduct
{
function getList()
{
return [
["prod_id"=>301,"prod_name"=>"红酒"],
["prod_id"=>302,"prod_name"=>"白酒"],
["prod_id"=>303,"prod_name"=>"啤酒"],
["prod_id"=>304,"prod_name"=>"洋酒"],
["prod_id"=>305,"prod_name"=>"酒精"],
];
}
}
2.工厂类
<?php
require("IProduct.php");
class ProductFactory
{
//商品工厂类
static function getProduct($type)
{
$obj=false;
if(!class_exists($type)) //这部分加载文件代码仅仅为了演示方便,请大家自行设置自动加载机制
{
require($type.".php");
}
switch($type)
{
case "Books":
$obj=new Books();
break;
case "Dogs":
$obj=new Dogs();
break;
case "Wines":
$obj=new Wines();
break;
}
return $obj;
}
}
3.客户调用类
require ("ProductFactory.php");
$obj=ProductFactory::getProduct("Books");//通过工厂方式来获取图书类
var_export($obj->getList());*/
结果如下所示:
使用工厂模式的好处是,当我们遇到变态需求的时候,我们能够拓展进行修改,比如我们想选择狗却想返回酒的数据,这时候,我们可以在工厂类中进行修改,例如:
<?php
require("IProduct.php");
class ProductFactory
{
//商品工厂类
static function getProduct($type)
{
if($type=="Dogs") $type="Wines";//变态需求产生
$obj=false;
if(!class_exists($type)) //这部分加载文件代码仅仅为了演示方便,请大家自行设置自动加载机制
{
require($type.".php");
}
switch($type)
{
case "Books":
$obj=new Books();
break;
case "Dogs":
$obj=new Dogs();
break;
case "Wines":
$obj=new Wines();
break;
}
return $obj;
}
}
以上!