php实现抽象工厂模式

  抽象工厂模式实现了
 1.将系统与实现的细节分离,我们可以在实例中添加或移除任意一个编码格式,而不会影响系统 
 2.对系统中功能相关的元素强制进行组合,因此,通过使用BloggsCommsManager可以确保只使用与BloggsCal相关的类
 3.添加新产品将会令人苦恼,因为不仅要创建新产品的具体实现,而且为了支持他,我们必须修改抽象创建者和他的每一个具体实现

<?php
/**
 * 抽象工厂模式实现了
 * 1.将系统与实现的细节分离,我们可以在实例中添加或移除任意一个编码格式,而不会影响系统 
 * 2.对系统中功能相关的元素强制进行组合,因此,通过使用BloggsCommsManager可以确保只使用与BloggsCal相关的类
 * 3.添加新产品将会令人苦恼,因为不仅要创建新产品的具体实现,而且为了支持他,我们必须修改抽象创建者和他的每一个具体实现
 */

//预约
abstract class ApptEncoder{
	abstract function encode();
}
//待办事宜
abstract class TtdEncoder{
	abstract function encode();
}
//联系人
abstract class ContactEncoder{
	abstract function encode();
}

//日历格式的编码器
class BloggsApptEncoder extends ApptEncoder{
	function encode(){
		return "预约编码格式 BloggsAppt <br>";
	}
}
//Mega格式的编码器
class BloggsContactEncoder extends ContactEncoder{
	function encode(){
		return "联系人编码格式 BloggsContact <br>";
	}
}

class BloggsTtdEncoder extends TtdEncoder{
	function encode(){
		return "代办事宜编码格式 BloggsTtd <br>";
	}
}

//抽象管理员类 抽象工厂类

/* abstract class CommsManager{
	abstract function getHeaderText();
	abstract function getApptEncoder();
	abstract function getTtdEncoder();
	abstract function getContactEncoder();
	abstract function getFooterText();
} */

abstract class CommsManager{
	const APPT=1;
	const TTD=2;
	const CONTACT=3;
	abstract function getHeaderText();
	abstract function make($flag_int);
	abstract function getFooterText();
}

/* class BloggsCommsManager extends CommsManager{
	function getHeaderText(){
		return "BloggsCal header<br>";
	}
	//下面3个方法使用了工厂方法
	function getApptEncoder(){
		return new BloggsApptEncoder();
	}
	function getTtdEncoder(){
		return new BloggsTtdEncoder();
	}
	function getContactEncoder(){
		return new BloggsContactEncoder();
	}
	function getFooterText(){
		return "BloggsCal footer <br>";
	}
} */

class BloggsCommsManager extends CommsManager{
	function getHeaderText(){
		return "BloggsCal header <br>";
	}
	function make($flag_int){
		switch ($flag_int){
			case self::APPT:
				return new BloggsApptEncoder();
			case self::CONTACT:
				return new BloggsContactEncoder();
			case self::TTD:
				return new BloggsTtdEncoder();
		}
			
	}
	function getFooterText(){
		return "BloggsCal footer <br>";
	}
}

$bloggs=new BloggsCommsManager();
print $bloggs->make(2)->encode();

抽象工厂的作用 

首先,将系统与实现的细节分离开来。我们可以在实例中添加或移除任意一个编码格式
而不会影响系统

对系统中功能相关的元素强制进行组合。因此,通过使用 BloggsCommsManager,可以确保
只使用与BloggsCal相关的类

添加新产品将会令人恼。因为不仅要创建新产品的具体实现,而且为了支持它,我们
必须修改抽象创建者和它的每一个具体实现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值