数据结构和算法常用知识

数据结构和算法常用知识

 

###################################################################
# 生成对象
################################################################### 
# 1.单例模式(Singleton): 只生成一个对象实例的特殊类
#
# 效果
# 	与使用全局变量相比,使用单利模式对象效果如何?首先是一个坏消息:单例和全局变量都容易被误用。
#	因为系统中得任何地方都可以访问单例,所以它们容易引发难以调试的依赖关系。如果改变单例,那么
#	使用它的所有类可能都会受到影响。这里依赖关系自身并不是问题。毕竟,只要我们声明一个接收某种
#   类型作为参数的方法,就会建立一种依赖关系。这里的问题是,单例的全局性质允许程序员以绕过类接
#	口定义的方式访问它们。在使用单例时,依赖关系隐藏于方法后,没有体现在方法签名中。这使得我们
#   难以跟踪系统中的依赖关系。因此,我们应当小心谨慎地使用单例类。
#   尽管如此,我认为适度地使用单例模式有助于改善系统的设计,避免在系统中不必要地传递对象。
#	在面向对象设计中,单例优于全局变量,因为这样可以防止其他代码向单例写入错误类型的数据。 
class Preferences
{
	private $props = [];
	private static $instance;
	
	private function __construct()
	{
	}
	
	public static function getInstance()
	{
		if (empty(self::$instance))
		{
			self::$instance = new Preferences();
		}
		return self::$instance;
	}
	
	public function setProperty(string $key, string $val)
	{
		$this->props[$key] = $val;
	}
	
	public function getPropery(string $key) : string
	{
		return $this->props[$key]; 
	}
}
###################################################################
# 2.工厂方法(Factory Method): 构建创造者类的继承层次
# 
# 效果
#	注意:创建者类的层次结构与产品类的层次结构相同。这是工厂模式的常
#	见效果,形成了一种特殊的代码重复。工厂模式的另一个问题是可能会产
#	生不必要的子类化。如果只是为了使用工厂方法模式而子类化创建者类,
#	那么你需要三思而后行(这也是本例加入页眉和页脚需求进行讲解的原因)。
#	本例只关注预约功能。如果还需要在示例中加入 "待办事宜" 和 "联系人"
#   功能,那么我们又会遇到新问题。我们需要一种可以同时处理一组相关实
#	现类的结构。
abstract class ApptEncoder
{
	abstract public function encode(): sring;
}

class BloggsAppEncoder extends ApptEncoder
{
	public function encode(): string
	{
		return "Appointment data encoded in BloggsCal format\n";
	}
}

class MegaAppEncode extends ApptEncoder
{
	public function encode(): string
	{
		return "Appointment data encoded in MegaCal format\n";
	}
}

abstract class CommsManager
{
	abstract public function getHeaderText(): string;
	abstract public function getApptEncoder(): string;
	abstract public function getFooterText(): string;
}

class BloggsCommsManager extends CommsManager
{
	public function getHeaderText(): string
	{
		return "BloggsCal header\n";
	}
	
	public function getApptEncoder(): ApptEncoder
	{
		return new BloggsAppEncoder();
	}
	
	public function getFooterText(): string
	{
		return "BloggsCal footer\n";
	}
}

class MegaCommsManager extends CommsManager
{
	public function getHeaderText(): string
	{
		return "MegaCal header\n";
	}
	
	public function getApptEncoder(): ApptEncoder
	{
		return new MegaAppEncode();
	}
	
	public function getFooterText(): string
	{
		return "MegaCal footer\n";
	}
}

$man = new BloggsCommsManager();
print($man->getHeaderText());
print($man->getApptEncoder()->encode());
print($man->getFooterText());

$woman = new MegaCommsManager();
print($woman->getHeaderText());
print($woman->getApptEncoder()->encode());
print($woman->getFooterText());
###################################################################
# 3.抽象工厂(Abstract Factory): 对功能相关的产品进行分组
###################################################################
# 4.原型(Prototype): 通过克隆生成对象
###################################################################
# 5.服务定位器(Serive Locator): 向系统索要对象 
###################################################################
# 6.依赖注入(Dependency Injection): 让系统给我们对象
###################################################################

 

  

 

posted on 2020-03-16 16:06  herisson_pan  阅读(13)  评论(0)    收藏  举报

导航