在软件开发的广阔天地中,高效的架构设计就像是一座灯塔,指引着我们在复杂的代码海洋中找到最短的航线。设计模式,作为软件工程中的一种解决方案模板,可以帮助我们应对各种常见的软件设计问题。下面,我们将揭秘十大经典设计模式,帮助你轻松应对复杂项目挑战。
1. 单例模式(Singleton)
定义:确保一个类只有一个实例,并提供一个全局访问点。
适用场景:当需要全局只有一个实例,并且这个实例需要被访问时,如数据库连接管理。
代码示例:
class Singleton:
_instance = None
@classmethod
def getInstance(cls):
if cls._instance is None:
cls._instance = cls()
return cls._instance
def some_business_logic(self):
pass
2. 工厂方法模式(Factory Method)
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
适用场景:当系统需要根据不同的情况创建多个类的时候。
代码示例:
class ProductA:
pass
class ProductB:
pass
class Creator:
def factory_method(self):
pass
class ConcreteCreatorA(Creator):
def factory_method(self):
return ProductA()
class ConcreteCreatorB(Creator):
def factory_method(self):
return ProductB()
3. 抽象工厂模式(Abstract Factory)
定义:创建相关或依赖对象的家族,而不需要明确指定具体类。
适用场景:当需要创建一组相关联的对象时。
代码示例:
class AbstractProductA:
pass
class ConcreteProductA1(AbstractProductA):
pass
class AbstractProductB:
pass
class ConcreteProductB1(AbstractProductB):
pass
class AbstractFactory:
def create_product_a(self):
pass
def create_product_b(self):
pass
class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ConcreteProductA1()
def create_product_b(self):
return ConcreteProductB1()
4. 建造者模式(Builder)
定义:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
适用场景:当需要创建复杂对象时,并且对象各部分的构建过程之间相互独立。
代码示例:
class Product:
def __init__(self):
self.part_a = None
self.part_b = None
class Builder:
def reset(self):
pass
def build_part_a(self):
pass
def build_part_b(self):
pass
class Director:
def __init__(self, builder):
self._builder = builder
def construct(self):
self._builder.reset()
self._builder.build_part_a()
self._builder.build_part_b()
5. 适配器模式(Adapter)
定义:将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作。
适用场景:当需要使用一个已经存在的类,而这个类的方法不符合我们的需求时。
代码示例:
class Target:
def request(self):
pass
class Adaptee:
def specific_request(self):
pass
class Adapter(Target):
def __init__(self, adaptee):
self._adaptee = adaptee
def request(self):
return self._adaptee.specific_request()
6. 模板方法模式(Template Method)
定义:定义一个操作中的算法的骨架,将一些步骤延迟到子类中。
适用场景:当想定义一个操作中的算法的骨架,同时让子类决定某些步骤的实现时。
代码示例:
class AbstractClass:
def template_method(self):
self.step_one()
self.step_two()
self.step_three()
def step_one(self):
pass
def step_two(self):
pass
def step_three(self):
pass
class ConcreteClass(AbstractClass):
def step_one(self):
pass
def step_two(self):
pass
def step_three(self):
pass
7. 策略模式(Strategy)
定义:定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。
适用场景:当需要定义一系列算法时,它们可以独立于使用算法的客户端而变化。
代码示例:
class Strategy:
def do_algorithm(self):
pass
class ConcreteStrategyA(Strategy):
def do_algorithm(self):
pass
class ConcreteStrategyB(Strategy):
def do_algorithm(self):
pass
class Context:
def __init__(self, strategy):
self._strategy = strategy
def set_strategy(self, strategy):
self._strategy = strategy
def execute(self):
self._strategy.do_algorithm()
8. 观察者模式(Observer)
定义:当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
适用场景:当需要为那些对对象状态变化作出响应的对象定义一个更新接口时。
代码示例:
class Subject:
def __init__(self):
self._observers = []
def attach(self, observer):
self._observers.append(observer)
def detach(self, observer):
self._observers.remove(observer)
def notify(self):
for observer in self._observers:
observer.update(self)
class ConcreteSubject(Subject):
def __init__(self):
self._state = 0
def some_business_logic(self):
self._state += 1
self.notify()
class Observer:
def update(self, subject):
pass
class ConcreteObserver(Observer):
def update(self, subject):
print("Observer: React to the change in state of subject")
9. 状态模式(State)
定义:允许一个对象在其内部状态改变时改变它的行为。
适用场景:当一个对象的行为依赖于它的状态,并且可以根据它的状态改变而改变时。
代码示例:
class Context:
def __init__(self):
self._state = None
def set_state(self, state):
self._state = state
def do_action(self):
self._state.do_action(self)
class State:
def do_action(self, context):
pass
class ConcreteStateA(State):
def do_action(self, context):
print("State A action")
class ConcreteStateB(State):
def do_action(self, context):
print("State B action")
10. 责任链模式(Chain of Responsibility)
定义:使多个对象都有机会处理请求,从而避免了请求发送者和接收者之间的耦合关系。
适用场景:当需要将请求的发送者和接收者解耦时。
代码示例:
class Handler:
def __init__(self, successor=None):
self._successor = successor
def handle_request(self, request):
if self.can_handle_request(request):
self.handle_it(request)
else:
if self._successor:
return self._successor.handle_request(request)
def can_handle_request(self, request):
pass
def handle_it(self, request):
pass
class ConcreteHandlerA(Handler):
def can_handle_request(self, request):
return request <= 10
def handle_it(self, request):
print(f"ConcreteHandlerA handles request {request}")
class ConcreteHandlerB(Handler):
def can_handle_request(self, request):
return request <= 20
def handle_it(self, request):
print(f"ConcreteHandlerB handles request {request}")
通过掌握这些设计模式,你将能够更好地应对复杂的项目挑战,创造出更加高效、可维护和可扩展的软件架构。记住,设计模式不是银弹,它们是解决问题的工具,正确地使用它们将使你的编程之路更加顺畅。
