设计模式:工厂模式
前言
来啦老铁!
近来一直在思索该学习什么技术细分领域好,思来想去,感觉学习设计模式比较靠谱,一个是设计模式有很多种,据简单统计有超过 30 种设计模式,足够我今年的文章量了,并且我所处的岗位类型(测试开发),对设计模式的需求会比那些人工智能啊、算法啊更大,对岗位能更容易起到帮助,于是我就先定这样一个技术细分领域,开始肝吧~
笔者将设计模式系列学习文章归入 “设计模式学习” 专题,感兴趣的同学可以关注专题一起学习吧!
今天我们先来学习:
-
工厂模式
备注:笔者的学习资料大部分来源于:菜鸟教程;
学习路径
- 设计模式简介;
- 设计模式代码实现;
- 设计模式优缺点分析;
- 设计模式使用场景介绍;
1. 设计模式简介;
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
2. 设计模式代码实现;
(以动物工厂为例)
1). 编写动物基类;
class Animal:
def __init__(self):
pass
def eat(self):
print("The animal is eating")
def walk(self):
print("The animal is walking")
def jump(self):
print("The animal is jumping")
2). 编写动物类,如猫类、狗类;
- 猫类:
from animal import Animal
class Cat(Animal):
def __init__(self):
super().__init__()
def eat(self):
print("The cat is eating.")
def walk(self):
print("The cat is walking.")
def jump(self):
print("The cat is jumping.")
- 狗类:
from animal import Animal
class Dog(Animal):
def __init__(self):
super().__init__()
def eat(self):
print("The dog is eating.")
def walk(self):
print("The dog is walking.")
def jump(self):
print("The dog is jumping.")
def sleep(self):
print("The dog is sleeping.")
其中,猫、狗都是动物,因此猫类和狗类都继承动物类,并且我们设置狗类拥有基类所没有的方法 sleep 方法;
3). 编写动物工厂类;
可以认为这个工厂类就是外部直接接触的对象,就像一个商店或工厂一样,你想要什么告诉他,他就会给你对应的商品或产品;
from cat import Cat
from dog import Dog
class AnimalFactory:
def __init__(self):
pass
@staticmethod
def get_animal(animal_name):
if not animal_name:
return None
if animal_name.lower() == "cat":
return Cat()
if animal_name.lower() == "dog":
return Dog()
4). 演示工厂模式的调用;
from animalFactory import AnimalFactory
def test():
dog = AnimalFactory.get_animal("dog")
dog.jump()
dog.eat()
dog.sleep()
cat = AnimalFactory.get_animal("cat")
cat.jump()
cat.eat()
if __name__ == '__main__':
test()
我的整体文件结构:
3. 设计模式优缺点分析(网络搜集);
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
-
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
-
作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
4. 设计模式使用场景介绍(网络搜集);
- 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
- Hibernate 换数据库只需换方言和驱动就可以。
- 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
笔者在实际应用场景中也有用过,例如,UI 自动化中,经常会用不同的浏览器进行测试,我们按照工厂模式设计浏览器工厂,当我们需要 Chrome,就告诉浏览器工厂,我要 Chrome,当我们需要 Firefox,就告诉浏览器工厂,我要 Firefox。。。浏览器工厂会返回对应浏览器实例,不同浏览器的不同配置、行为等,就可以在对应的浏览器类中实现好,而不必关心怎么制造出这样的浏览器实例~
如果本文对您有帮助,麻烦点赞、关注!
谢谢!