PHP设计模式-简单工厂方法

简介: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

优缺点:
优点:工厂处理好逻辑后,外部可直接调用,不用一一调用各自的逻辑类,优化代码结构
缺点:违反高内聚责任分配原则

实现条件:
1.工厂条件:处理逻辑
2.产品角色:interface 或者 abstract 产品父类,描述所有产品接口
3.产品具体角色:实现 interface 或者继承 abstract 的具体产品类,具体产品类;

代码(代码仿照白俊瑶博客写的,完全为了加深印象):
1.普通的例子
Bad.php

<?php

namespace factory;

class Bad{
	
	
	public function getResult($numA,$operation,$numB){
		
		switch($operation){
			case '+':
			$result = $numA+$numB;
			break;
			case '-':
			$result = $numA-$numB;
			break;
			case '/':
			if($numB !=0){
				$result = $numA/$numB;
			}else{
				throw new \InvalidArgumentException('除数不能为0');
			}
			break;
			case '*':
			$result = $numA*$numB;
			break;
			default:
				throw new \InvalidArgumentException('除数不能为0');
			
		}
		return $result;
	}
	

index.php

<?php
require __DIR__.'/../Loader.php';

spl_autoload_register('Loader::autoload');//注册自动加载


$program = new \factory\Bad();

$result = $program->getResult(1,'+',2);

echo $result;

2.把各个运算单独封装类
Operation.php

<?php

namespace factory;

abstract class Operation{
	protected $numA=0;
	protected $numB=0;
	
	abstract public function getResult();
	
	public function setNumberA($number){
		$this->numA = $number;
	}
	
	public function setNumberB($number){
		$this->numB = $number;
	}
	
}

Sub.php减法类

<?php

namespace factory;

abstract class Operation{
	protected $numA=0;
	protected $numB=0;
	
	abstract public function getResult();
	
	public function setNumberA($number){
		$this->numA = $number;
	}
	
	public function setNumberB($number){
		$this->numB = $number;
	}
	
}

index.php

<?php
require __DIR__.'/../Loader.php';

spl_autoload_register('Loader::autoload');//注册自动加载


$program = new \factory\Sub();
$program->setNumberA(5);
$program->setNumberB(2);

$result = $program->getResult();

echo $result;

3.简单工厂模式
Factory.php

<?php

namespace factory;

class Factory
{
	public function create($operation){
		switch($operation){
			case '+':
			return new Add();
			break;
			case '-':
			return new Div();
			break;
			case '*':
			return new Mul();
			break;
			case '/':
			return new Div();
			break;
			default:
			throw new \InvalidArgumentException('不支持的运算');
			break;
		}
	}
	
}

index.php

<?php
require __DIR__.'/../Loader.php';

spl_autoload_register('Loader::autoload');//注册自动加载


$program = new \factory\Factory();
$operation =  $program->create('+');
$operation->setNumberA(5);
$operation->setNumberB(3);
$result = $operation->getResult();
echo $result;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值