工厂模式的定义
工厂模式(Factory Pattern)是 软件开发中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
抽象工厂模式的结构与实现
抽象工厂模式由抽象工厂、具体工厂、抽象产品和具体产品等4要素组成。
1.模式结构
抽象工厂模式的主要角色如下
- 抽象工厂(Abstract Factory):提供了创建了产品的接口,调用者通过访问具体工厂的工厂方法来创建产品
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建
- 抽象产品(Product) :定义了产品的规范,描述了产品的主要特性和功能
- 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂一一对应。
2.模式实现
使用抽象工厂方法模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SLRRWvEJ-1630744507445)(https://www.runoob.com/wp-content/uploads/2014/08/3E13CDD1-2CD2-4C66-BD33-DECBF172AE03.jpg “抽象工厂”)]
<?php
abstract class AbstractFactory
{
abstract function getShape(String $shapeType);
abstract function getColor(String $color);
}
class ShapeFactory extends AbstractFactory {
function getShape(String $shapeType)
{
if(is_null($shapeType)){
return null;
}
if($shapeType == 'Circle'){
return new Circle();
}
if($shapeType == 'Rectangle'){
return new Rectangle();
}
}
function getColor(String $color)
{
return null;
}
}
class ColorFactory extends AbstractFactory
{
function getShape(String $shapeType)
{
return null;
}
function getColor(String $color)
{
if(is_null($color)){
return null;
}
if($color == 'Red') {
return new Red();
}
if($color == 'Green'){
return new Green();
}
}
}
interface Shape
{
function draw();
}
interface Color
{
function fille();
}
class Circle implements Shape
{
function draw()
{
echo '我是一个圆';
}
}
class Rectangle implements Shape
{
function draw()
{
echo '我是一个正方形';
}
}
class Red implements Color
{
function fille()
{
echo '我是红色';
}
}
class Green implements Color
{
function fille()
{
echo '我是绿色';
}
}
class FactoryProducer
{
public static function getFactory(String $factory)
{
if($factory == 'Shape'){
return new ShapeFactory();
}
if($factory == 'Color')
{
return new ColorFactory();
}
}
}
class AbstractFactoryPatternDemo
{
public function index()
{
$shapeFactory = FactoryProducer::getFactory('Shape');
$circle = $shapeFactory->getShape('Circle');
echo $circle->draw();
$rect = $shapeFactory->getShape('Rectangle');
echo $rect->draw();
$colorFactory = FactoryProducer::getFactory('Color');
$red = $colorFactory->getColor('Red');
echo $red->fille();
$green = $colorFactory->getColor('Green');
echo $green->fille();
}
}
?>
简单工厂模式的结构与实现
简单工厂模式由工厂、抽象产品和具体产品等3要素实现
1.模式结构
简单工厂方法模式的主要角色如下
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建
- 抽象产品(Product) :定义了产品的规范,描述了产品的主要特性和功能
- 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂一一对应。
2.模式实现
使用简单工厂方法模式实现简单计算器
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2021/9/4
* Time: 15:47
*/
abstract class Operation
{
abstract public function getValue($param1,$param2);
}
class OperationMul extends Operation
{
public function getValue($param1, $param2)
{
return $param1 * $param2;
}
}
class OperationAdd extends Operation
{
public function getValue($param1, $param2)
{
return $param1 + $param2;
}
}
class OperationDiv extends Operation
{
public function getValue($param1, $param2)
{
try{
if($param2 == 0)
throw new Exception("除数不能为0");
else
return $param1 / $param2;
}catch(Exception $e){
$e->getMessage();
}
}
}
class OperationSub extends Operation
{
public function getValue($param1, $param2)
{
return $param1 - $param2;
}
}
class Factory
{
public static function getMethodFactory($factoryName)
{
switch($factoryName){
case 'add':
return new OperationAdd();
break;
case 'sub':
return new OperationSub();
break;
case 'mul':
return new OperationMul();
break;
case 'div';
return new OperationDiv();
break;
}
}
}
$addFactory = Factory::getMethodFactory('add');
$sum = $addFactory->getValue(20,50);
echo '20 + 50 = '.$sum;
$subFactory = Factory::getMethodFactory('sub');
$sub = $subFactory->getValue(10,5);
echo '10 - 5 = '.$sub;
$mulFactory = Factory::getMethodFactory('mul');
$mul = $mulFactory->getValue(30,5);
echo '30 * 5 = '.$mul;
$divFactory = Factory::getMethodFactory('div');
$div = $divFactory->getValue(10,2);
echo '10 / 2 = '.$div;
?>