什么是设计模式?
答:经典场景的经典解决方法
模式是因为语言不够灵活,不能适应复杂的场景,而想出的办法。
每一个模式描述了一个在我们周围不断重复发生的问题,以及解决该问题的方案。
这样,你就能一次又一次地使用该方案而不必做重复劳动.
一般而言,一个模式有四个基本要素:
-
模式名称(pattern name) 一个助记名,它用一两个词来描述模式的问题、解决方案和效果。
-
问题 (problem) 描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。
-
解决方案 (solution) 描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
-
效果 (consequences) 描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。
简单工厂
开闭原则,应该对类的增加开放,修改闭合。
当新增一个 MyPDO 类时,还得修改 Factory 类,显然不符合开闭原则
因此引出抽象工厂模式
class Factory
{
public static getDB($type){
if ($type == 'MySQL') {
return new MySQL();
}else if ($type == 'Sqlite'){
return new Sqlite();
}else if ($type == 'MyPDO'){
return new PMyPDODO();
}else{
throw new Exception("sorry", 1);
}
}
function __construct(argument)
{
# code...
}
}
// 获取DB对象时
Factory::getDB('MySQL');