第1章:简单工厂模式
面向对象
面向对象(object oriented)三大特性:封装、继承、多态
复制 v.s. 复用,紧耦合 v.s. 松耦合
尽可能避免重复代码,将业务逻辑与界面逻辑拆分
简单工厂模式:工厂负责实例化对象的类
from abc import ABC, abstractmethod
from typing import Text
# 计算器业务逻辑
# 运算类定义为抽象类
# 加、减、乘、除运算类继承运算类
class Operation(ABC):
"""
an abstract base class for operation
args:
number_a (float)
number_b (float)
return:
result (float)
"""
def __init__(self) -> None:
self._number_a = 0
self._number_b = 0
@abstractmethod
def get_result(self) -> float:
"""
please reimplement this method
"""
@property
def number_a(self) -> float:
return self._number_a
@number_a.setter
def number_a(self, number: float) -> None:
self._number_a = number
@property
def number_b(self) -> float:
return self._number_b
@number_b.setter
def number_b(self, number: float) -> None:
self._number_b = number
class OperationAdd(Operation):
def __init__(self):
pass
def get_result(self) -> float:
return number_a + number_b
class OperationSub(Operation):
def __init__(self):
pass
def get_result(self) -> float:
return self._number_a - self._number_b
class OperationMul(Operation):
def __init__(self):
pass
def get_result(self) -> float:
return self._number_a * self._number_b
class OperationDiv(Operation):
def __init__(self):
pass
def get_result(self) -> float:
assert self._number_b != 0, "exception: division by zero"
return self._number_a / self._number_b
# 计算器实例工厂
class OperationFactor(object):
"""
运算类实例工厂,实例化具体运算类
"""
switch = {
"+": OperationAdd(),
"-": OperationSub(),
"*": OperationMul(),
"/": OperationDiv(),
}
def __init__(self) -> None:
pass
def create_operator(self, operator: Text) -> Operation:
return self.switch[operator]
# 计算器界面逻辑
if __name__ == "__main__":
number_a = 1
number_b = 2
for operator in "+-*/":
oper = OperationFactor().create_operator(operator)
oper.number_a = number_a
oper.number_b = number_b
print(operator, ": ", oper.get_result())
+ : 3
- : -1
* : 2
/ : 0.5
UML类图
类图
(例如:动物):类(class)用矩形框表示,类图分三层,第一层是类名,如果是抽象类,则用斜体显示;第二层是类的特性,通常是字段和属性;第三层是类的操作,通常是方法或行为。前置符号:+
表示public
;-
表示private
;#
表示protected
。
接口图
(例如:飞翔):接口(interface)用矩形框表示,接口图分两层,第一层是接口名,顶端有<<interface>>
;第二层是接口方法。接口还可以使用棒棒糖表示法表示。
继承
关系:用空心三角形 + 实线表示;
实现接口
:用空心三角形 + 虚线表示;
关联
(association)关系:一个类“知道”另一个类(如引用另一个类对象作为成员),用实线箭头表示;
聚合
(aggregation)关系:表示一种弱的“拥有”关系,A对象可以包含B对象,但B对象不是A对象的一部分,用空心菱形 + 实线箭头表示;
合成
(组合,composition)关系:是一种强的“拥有”关系,体现严格的部分和整体的关系,部分和整体的生命周期相同,用实心菱形 + 实线箭头表示;合成关系连线两端的数字称为基数,表示这一端的类可以有几个实例,如果一个类可能有无数个实例,则用“n”表示。关联关系、聚合关系也可以有基数。
依赖
(dependency)关系:用虚线箭头来表示;