创建型模式--工厂模式
来源:互联网 发布:淘宝苹果4s外壳多少钱 编辑:程序博客网 时间:2024/06/06 13:58
工厂模式包含一个超类(父类),这个超类提供了一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建。
也就是说:定义一个创建对象的接口,但由子类决定要实例化类的哪一个;即通过子类来创建对象。工厂方法使一个类的是实例化延迟到其子类。
基本思想:
l 定义一个抽象的工厂接口类
l 定义一个抽象的产品接口类
l 根据需要从产品接口派生产品子类
l 对于每一个产品子类,从工厂接口派生工厂子类,负责该产品的创建
l 客户端根据实际需要,调用工厂子类,创建所需要的产品。
1 普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
2 多个工厂方法模式:是对普通工厂模式的改进,多个工厂方法模式是提供多个工厂方法,分别创建对象
3 静态工厂方法模式:将多个工厂方法模式的方法设置为静态的,不需要创建实例,直接调用即可。
总结:
凡是出现大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法进行创建。
普通工厂模式如果传入的字符串有误,不能正确创建对象,静态工厂方法模式,不需要实例化工厂类。
大多数情况下,选用静态工厂方法模式。
场景1:
1. 一个基类Person,包涵获取名字、性别的方法。该基类有2个子类Male和Female,可以打招呼,还有一个工厂类。
2. 工厂类有一个方法名get_person有两个输入参数:名字和性别
3. 用户使用工厂类,通过调用get_person方法。
在程序运行期间,用户传递性别给工厂,工厂创建一个与性别有关的对象。
因此工厂类运行期间,决定了哪个对象应该被创建。
class Person(): def __init__(self): self.name = None self.gender = None def get_name(self): return self.name def get_gender(self): return self.genderclass Male(Person): def __init__(self, name): print 'Hello Mr.' + nameclass Female(Person): def __init__(self, name): print 'Hello Miss.' + nameclass Factory(): def get_person(self, name, gender): if gender == 'M': return Male(name) if gender == 'F': return Female(name)if __name__ == '__main__': factory = Factory() person = factory.get_person('Lanli', 'M')运行结果: Hello Mr.Lanli
场景二:
汽车都有驾驶的功能,汽车类做为父类,宝马和奔驰都属于汽车,定义一个工厂类Drive,在该类种决定具体要实例化哪一个对象。
# -*- coding: utf-8 -*-class Car(): def drive(self): passclass BMW(Car): def __init__(self, carname): self.__name = carname def drive(self): print 'Drive the BMW as ' + self.__nameclass Benz(Car): def __init__(self, carname): self.__name = carname def drive(self): print 'Drive the Benz as ' + self.__nameclass Drive(): def drive_car(self, name): if name == 'BMW': return BMW(name) if name == 'Benz': return Benz(name)#使用全局函数改写工厂类def driver(name): if name == 'BMW': return BMW("BMW") elif name=="Benz": return Benz("Benz")if __name__ == "__main__": drive = Drive() d = drive.drive_car('BMW') d.drive() drive1 = driver('Benz') drive1.drive()运行结果:Drive the BMW as BMWDrive the Benz as Benz
此外还有工厂方法模式
工厂方法模式是工厂类被具体的工厂继承。
1 抽象工厂角色:这是工厂方法模式的核心,与具体的程序无关,具体工厂接口必须继承它
2 具体工厂角色:与具体业务逻辑相关,由应用程序调用以创建对应的具体产品对象。
3 抽象产品角色:是具体产品继承的父类或者是实现的接口
4 具体产品角色:由一个具体类实现。
这里仅仅是举了个简单的例子,详细可参考HEAD FIRST设计模式
- 工厂模式--创建型模式
- 创建型模式--工厂模式
- 创建型模式-工厂模式
- 创建型模式--工厂模式
- 创建型模式:【工厂模式】
- 创建型--工厂模式
- 工厂模式(创建型)
- 设计模式 - 创建型模式 - 工厂模式
- 创建型模式:工厂模式(简单工厂模式,抽象工厂模式,工厂模式)
- 创建模式-工厂模式
- 创建型模式-抽象工厂
- 创建型模式-简单工厂
- 创建型模式-工厂方法
- 创建型模式-工厂方法
- 创建型模式-简单工厂
- 创建型模式-抽象工厂
- 创建型--工厂方法模式
- 工厂方法模式(创建型)
- SQL查找含有指定表名或者字段名的方法
- 刷题——Moo University
- POJ 3660 Floyd求传递闭包
- 二叉树的前/中/后 序遍历(递归非递归两种)
- 毕竟是整理看看哇
- 创建型模式--工厂模式
- JavaSe ——3、面向对象
- Mysql学习笔记2
- app应用--->framework层---->hal硬件抽象层---->kernel driver
- 正确的类引用却显示* cannot be resolved
- 乱七八糟学习笔记之jpa标签
- WSGI in Flask --2
- 解决vux 引入组件时Error in render function: "TypeError: _vm.$t is not a function"问题
- 【云栖精选7月刊】抛开晦涩的算法、模型_让我们来谈谈互联网架构