工厂方法模式

问题:
1. 需要能够相对轻松地加入一些新的产品类型。
2. 每一个产品类型都可定制特定的功能。

概念:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。

实现:
1. 类图示例:

2. 代码示例:

//产品抽象基类
abstract class ApptEncoder
{
	abstract public function encode();
}
//产品子类1
class BloggsApptEncoder extends ApptEncoder
{
	public function encode()
	{
		return "Appointment data encode in BloggsCal format\n";
	}
}
//产品子类2
class MegaApptEncoder extends ApptEncoder
{
	public function encode()
	{
		return "Appointment data encode in MegaCal format\n";
	}
}

//创建者抽象基类
abstract class CommsManager
{
	abstract public function getHeaderText();
	abstract public function getApptEncoder();
	abstract public function getFooterText();
}
//创建者子类1
class BloggsCommsManager extends CommsManager
{
	public function getHeaderText()
	{
		return "BloggsCal header\n";
	}
	public function getApptEncoder()
	{
		return new BloggsApptEncoder();
	}
	public function getFooterText()
	{
		return "BloggsCal footer\n";
	}
}
//创建者子类2
class MegaCommsManager extends CommsManager
{
	public function getHeaderText()
	{
		return "MegaCal header\n";
	}
	public function getApptEncoder()
	{
		return new MegaApptEncoder();
	}
	public function getFooterText()
	{
		return "MegaCal footer\n";
	}
}

//生成产品子类1对象
$manager1 = new BloggsCommsManager();
$encoder1 = $manager1->getApptEncoder();
echo $encoder1->encode();
//生成产品子类2对象
$manager2 = new MegaCommsManager();
$encoder2 = $manager2->getApptEncoder();
echo $encoder2->encode();

效果:
优点:
1. 实现了单一职责原则,创建者类的每一个子类都只需要负责实例化对应的产品子类。
2. 添加新的产品类型时,只需要添加一个新的产品子类,同时添加一个对应的创建者子类,无需修改原有类,只对扩展开放,不对修改开放,符合开放-封闭原则。
缺点:
1. 形成了一种特殊的代码重复,而且可能会导致不必要的子类化。
2. 客户端需要决定实例化哪个创建者子类。

 

posted @ 2018-09-10 17:46  疯一样的狼人  阅读(119)  评论(0编辑  收藏  举报