数据结构和算法常用知识
数据结构和算法常用知识
###################################################################
# 生成对象
###################################################################
# 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) 收藏 举报
浙公网安备 33010602011771号