一、什么是设计模式?怎么来的,有什么类型,如何学?
定义
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中 面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的
讲人话
设计模式就是:设计模式是一套被 反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。
怎么来的,那个大佬设计的
说到这个不得不提大名鼎鼎的”四人帮“。
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。
- 对接口编程而不是对实现编程。
- 优先使用对象组合而不是继承。
有什么种类
且看下面我画的脑图:
这些模式我们都应该了解并掌握其思想。站在巨人的肩膀上,看看别人是怎么思考的。哈哈哈,扯远了,回归正题
如何学
这个我也不懂,如果你是一个小白,那就多多实践,和我一样多敲而已(我也是菜鸡)。 讲之前,先入门一下UML图和时序图
二、UML图和时序图
先从一个实例开始,如下图所示:
- 虚线空箭头:表示继承实现关系,如上图中的台式电脑和手提电脑依赖继承自抽象类computer。
- 虚线带箭头:表示依赖关系,如图中的学生依赖于手提电脑。
- 实线空心箭头:表示继承泛化关系。
- 实线: 表示关联关系,如图中的学生和学生证,学生证可以证明学生的身份,学生为学生证的所有者。
- 实线空菱形箭头:表示聚合关系,如图中的学生属于学校的一份子。
- 实线实菱形箭头:表示组合关系,如图中的内存条,固态等都是电脑的组成部分。
类之间的关系
一般类图
1.实现关系(realize)
继承关系为is-a,两个对象如果用is-a表示,就表示继承关系。继承是对象之间耦合度最高的一种关系,子类继承父类的所有细节,除了父类的私有属性和方法。
2.泛化关系(generalization)
泛化关系为某一类的具体实现。
3.聚合关系(aggregation)
表示has-a的关系,是一种不稳定的包含关系,个体存在于总体当中但不依赖总体,就好比学生与学校,学校不办了,学生可以转学到另一个学校,不会因为学校的不存在而导致学生个体的消亡。
4.组合关系(Composition)
也是has-a的关系,但是却是一种稳定的包含关系,总体的消亡,个体也不复存在。理解为一种强依赖的特殊聚合关系。
5. 依赖关系(dependency)
依赖关系是用一套带箭头的虚线表示的,如下图表示学生办公依赖于手提电脑,他描述的是运行期间会用到另一个对象的关系。
三、简单工厂实例
适合应用场景:
-
工厂类负责的创建比较少:工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂 。
-
客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
简单工厂模式所包含的角色和UML用例:
简单工厂模式包含三个角色:工厂角色负责实现创建所有实例的内部逻辑;抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口;具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
UML用例:
四、直接撸代码:
<?php
/**
* 来个开胃菜,简单工厂的模式
*/
//具体产品cat
class Cat
{
function __construct()
{
# code...
echo "I am a <span style='color:red'>cat</span> class".'<br>';
}
}
//具体产品dog
class Dog
{
function __construct()
{
echo "I am a dog class".'<br>';
}
}
//简单工厂类
class Factory
{
public static function CreateAnimal($name=null)
{
if ($name == 'Cat') {
# code...
return new Cat();
} elseif ($name == 'Dog') {
# code...
return new Dog();
} else {
return '没传入参数,';
}
}
}
$cat = Factory::CreateAnimal('Cat');
$cat = Factory::CreateAnimal('Dog');
最后输出结果:
好了,简单的工厂模式,到此就结束了,未完待续……欢迎各位大神留言交流。