工厂模式、抽象类,单例及复制对象的简单介绍

本文深入解析了简单工厂、工厂方法、抽象工厂等设计模式的原理与应用,通过具体实例展示了不同模式的优缺点,帮助读者理解和掌握面向对象设计原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 简单工厂模式
    优缺点:
    定义起来简单,容易理解
    但是如果对象的创建方式过于复杂,则会导致工厂代码急剧增加
# 商场买鞋,首先有各种品牌的鞋子
# 商场的功能是出售各种品牌的鞋子,鞋子由工厂提供
# 工厂生产各种品牌的鞋子

# 各个品牌的鞋子
class NikeShoe:
    # __str__是为了能够返回字符串
    def __str__(self):
        return '耐克鞋子'
class LiniShoe:
    def __str__(self):
        return '李宁鞋子'
class NeiShoe:
    def __str__(self):
        return '内联升鞋子'
class AdiShoe:
    def __str__(self):
        return '阿迪鞋子'

# 商店
class Store:
    def __init__(self,factory):
        self.factory=factory
    def sell_shoe(self,brand):
        return self.factory.create(brand)

# 工厂
class ShoeFactory:
    def create(self,brand):
        if brand=='nike':
            return NikeShoe()
        elif brand=='lining':
            return LiniShoe()
        elif brand=='nei':
            return NeiShoe()

# 补充工厂
class NikeAdiFactory:
    def create(self,brand):
        if brand=='nike':
            return NikeShoe()
        elif brand=='adi':
            return AdiShoe()

# 创建商场
my_store=Store(ShoeFactory())
my_store2=Store(NikeAdiFactory())

# 销售鞋子
s1=my_store.sell_shoe('nike')
s2=my_store.sell_shoe('lining')
s3=my_store2.sell_shoe('adi')

print(s1)
print(s2)
print(s3)

2.工厂方法模式
优缺点:
一个工厂只创建一种对象,适用于创建对象比较复杂的情况
不适用类过多的情况

# 创建飞船类
class Ship:
    def __init__(screen,gc,bullet,oil):
        self.screen=screen
        self.gc=gc
        self.bullet=bullet
        self.oil=oil

# 创建外星人类
class Alien:
    def __init__(screen,gc):
        self.screen=screen
        self.gc=gc

# 各种属性类
class GameConfig:
    pass
class Bullet:
    pass
class Screen:
    pass
class Oil:
    pass

# 飞船工厂
class ShipFactory:
    def create(self):
        gc=GameConfig()
        bullet=Bullet()
        screen=Screen()
        oil=Oil()
        return Ship(screen,gc,bullet,oil)

# 外星人工厂
class AlienFactory:
    def create(self):
        gc=GameConfig()
        screen=Screen()
        return Alien(screen,gc)

class GameMain:
    def __init__(self):
        self.ship_factory=ShipFactory()
        self.alien_factory=AlienFactory()
        ship=self.ship_factory.create()
        alien=self.alien_factory.create()

3.抽象工厂
优缺点:
抽象类不是用来创建对象的,而是用来定义接口的
一个工厂类可以用来创建多种对象,每个工厂所创建的对象都是一组相关的对象
将工厂中共有的方法统一抽象到一个父类中,这样就避免了在工厂中编写重复性的代码

class NikeShoe:
    def __str__(self):
        return '耐克鞋子'
class NikeClothes:
    def __str__(self):
        return '耐克衣服'
class AdiShoe:
    def __str__(self):
        return '阿迪鞋子'
class AdiClothes:
    def __str__(self):
        return '阿迪衣服'

class Stroe:
    def __init__(self,factory):
        self.factory=factory
    def sell_shoe(self):
        return self.factory.create_shoe()
    def sell_clothes(self):
        return self.factory.create_clothes()

class Factory:
    def create_shoe(self):
        return self.shoe()
    def create_clothes(self):
        return self.clothes()    

class NikeFactory(Factory):
    def __init__(self):
        self.shoe=NikeShoe
        self.clothes=NikeClothes

class AdiFactory(Factory):
    def __init__(self):
        self.shoe=AdiShoe
        self.clothes=AdiClothes

s=Stroe(AdiFactory())

print(s.sell_shoe())
print(s.sell_clothes())

4.抽象类(只是延伸)
抽象类(接口)不是用来创建对象,而是用来定义类的标准,抽象类主要是用来规定类中具有哪些方法,一般用来被其他类继承

# 在python中,提供了一个类ABC,这个类专门用来被抽象类继承
# ABC=AbstractClass
import abc
# 引入abc模块
class A(abc.ABC):
    '''
    抽象类
    '''
    @abc.abstractmethod
    # 将方法装饰为抽象方法,抽象方法必须被子类实现
    def fn1(self):
        pass
    def fn2(self):
        pass
    def fn3(self):
        pass

class B(A):
    '''
    子类必须要实现抽象类中的抽象方法
    '''
    def fn1(self):
        print('hello')
b=B()
print(b)

#运行结果:<__main__.B object at 0x0000000001EB7BA8>

5.单例
Singleton类型的对象只能有一个

class Singleton:
    instance=None   #实例
    def __new__(cls):#创建新类
        # 判断是否该类对象存在,不存在则根据父类创建,
        # 存在则返回已有对象
        if not cls.instance:
            cls.instance=super().__new__(cls)
        return cls.instance
    def __init__(self):
        pass

6.复制
http://www.pythontutor.com(检测程序运行轨迹的网址)
浅复制,就是只复制对象本身,而对象中的属性(元素)不会被复制,当对象本身发生改变时,复制方也会随之发生改变

#几种常见的浅复制
l=[1,2,3,[4,5,6]]
l1=l.copy()
l2=l[:]
l3=list(l)
print(l1)
print(l2)
print(l3)

这里写图片描述
对于深浅复制的对比

import copy
class Bus:
    def __init__(self,people):
        self.people=people
    def up(self,name):
        self.people.append(name)
    def down(self,name):
        self.people.remove(name)
b=Bus(['小明','小红','小芳'])
b1=copy.copy(b)        #对b进行浅复制
b2=copy.deepcopy(b)    #对b进行深复制

b.up('小华')
b.down('小明')

print(b.people)
print(b1.people)
print(b2.people)

运行结果:
['小红', '小芳', '小华']
['小红', '小芳', '小华']
['小明', '小红', '小芳']

这里写图片描述


小白笔记

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值