北风设计模式课程---2、工厂方法模式
一、总结
一句话总结:
工厂方法模式相对于简单工厂模式只是修改了 【工厂核心类-将它变成接口】,具体的创建产品的工作交给【工厂核心类的子类】
满足了开闭原则:不同产品的创建跑到不同的子工厂,比如创建苹果去苹果工厂,创建香蕉去香蕉工厂,我的工厂核心类只负责定义标准
1、工厂方法模式实例?
水果基类(接口):定义苹果,香蕉的采摘标准:苹果类,香蕉类
水果工厂基类(接口):定义苹果,香蕉的工厂标准:苹果工厂,香蕉工厂
创建苹果去苹果工厂,创建香蕉去香蕉工厂,我的工厂核心类只负责定义标准
2、工厂方法模式对简单工厂模式的修改体现在哪里?
工厂核心类变成了接口:将工厂变成接口,将实际创建工作推迟到子类当中。
工厂核心类成为一个抽象工厂角色:这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口
工厂子类完成具体的工厂生成工作
3、工厂方法模式中包含的角色及其职责?
1.抽象工厂(Creator)角色:【比如水果工厂】:工厂方法模式的核心,任何工厂类都必须实现这个接口。
2.具体工厂( Concrete Creator)角色:【比如苹果工厂,香蕉工厂】:具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
3.抽象(Product)角色:【比如水果接口,比如定义采摘水果的标准】:工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体产品(Concrete Product)角色:【比如苹果,香蕉】:工厂方法模式所创建的具体实例对象。
4、工厂方法模式的别名是什么?
多态工厂模式:因为具体工厂类都有共同的接口,或者有共同的抽象父类。
5、工厂方法模式的核心是什么?
抽象工厂类
6、工厂方法模式的好处是?
符合“开放-封闭”原则:当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端
7、“开放-封闭”原则是什么意思?
开放:有很好的扩展性
封闭:扩展的时候不去修改原来的类
8、创建型设计模式的作用是什么?
在类创建的时候定义标准,发挥作用
9、legend2系统中应该工厂方法模式实例?
抽象产品:英雄(接口),里面有个__construct()创建英雄的抽象方法,或者有一个写入数据库数据的抽象方法,还有生成资质,生成属性的抽象方法
具体产品:人族英雄,魔族英雄,仙族英雄,__construct()创建英雄完成就写入数据库
抽象工厂角色:英雄工厂(接口),里面有个getHero抽象方法
具体工厂角色:人族英雄工厂,魔族英雄工厂,返回英雄对象的工厂,创建英雄对象对的时候把英雄对象的数据写到数据库
10、如何在实例中使用工厂方法模式?
实例对应角色:用实例对应好工厂方法模式的四种角色即可,这样建模超级简单,(抽象产品,具体产品,抽象工厂角色,具体工厂角色)
11、php中的面向对象是在什么阶段发挥作用?
向页面传递数据 和 向数据库书写数据 的时候
二、内容在总结中
1、相关知识
2、java代码结构
![](https://img2018.cnblogs.com/blog/1163900/201905/1163900-20190530030022676-987924481.png)
3、php代码
![](https://img2018.cnblogs.com/blog/1163900/201905/1163900-20190530025925042-1966429621.png)
<?php
//抽象角色
Interface Fruit{
//采集
public function get();
};
//具体角色1
class Apple implements Fruit{
public function get(){
echo '采集苹果<br>';
}
}
//具体角色2
class Banana implements Fruit{
public function get(){
echo '采集香蕉<br>';
}
}
//抽象工厂角色
interface FruitFactory{
//定义工厂生产产品的规则
public static function getFruit();
}
//具体工厂角色1:苹果
class AppleFactory implements FruitFactory{
public static function getFruit(){
return new Apple();
}
}
//具体工厂角色2:香蕉
class BananaFactory implements FruitFactory{
public static function getFruit(){
return new Banana();
}
}
//调用实例
AppleFactory::getFruit()->get();
BananaFactory::getFruit()->get();
?>