zoukankan      html  css  js  c++  java
  • 单例和工厂设计模式

    单例模式

    1、单例类只能有一个实例。
    2、单例类必须自己创建自己的唯一实例。
    3、单例类必须给所有其他对象提供这一实例。

    """
    __new__ 保证内存唯一
    __init__ 保证初始化唯一
    函数的默认值传参,只会在内存中创建一份
    """
    
    
    class Sington:
        __has = None
        __firstInit = True
    
        def __new__(cls, *args, **kwargs):
            if cls.__has is None:
                cls.__has = super(Sington, cls).__new__(cls, *args, **kwargs)
            return cls.__has
    
        def __init__(self, cart=[]):
            self.cart = cart
    
        # def __init__(self):
        #     #     if self.__firstInit:
        #     #         Sington.cart = []
        #     #         Sington.__firstInit = False
    
    
    c1 = Sington()
    c2 = Sington()
    c1.cart.append("acb")
    c1.cart.append("efg")
    c2.cart.append("efg")
    
    print(hex(id(c1)))
    print(hex(id(c2)))
    print(c1.cart)
    print(c2.cart)
    

     简单工厂模式:工厂类,根据传递来的参数,来创建对应的实例

    # 简单工厂
    # 简单工厂定义一个Factory类,可以根据参数的不同返回不同类的实例,
    # 被创建的实例通常有共同的父类。实质是由一个工厂类根据传入的参数,动态决定应该创#建哪一个产品类实例。
    class Car(object):
        def run(self):
            print("吧里吧里的跑")
        def stop(self):
            print("蹭蹭的停车")
    
    
    class BMW(Car):
        def run(self):
            print("宝马--->吧里吧里的跑")
        def stop(self):
            print("宝马--->蹭蹭的停车")
    
    
    class Benz(Car):
        def run(self):
            print('奔驰-->>>吧里吧里的跑...')
    
        def stop(self):
            print('奔驰-->>>蹭蹭的停车...')
    
    
    class Skoda(Car):
        def run(self):
            print('斯柯达-->>>吧里吧里的跑...')
    
        def stop(self):
            print('斯柯达-->>>蹭蹭的停车...')
    
    
    class CarFactory():
        def new_cart(self,name):
            if name == "BMW":
                return BMW()
            elif name == "Benz":
                return Benz()
            elif name == "skd":
                return Skoda()
    
    
    class CarStore():
        def __init__(self,factory):
            self.factory = factory
    
        def order(self,name):
            return self.factory.new_cart(name)
    
    
    car_factory = CarFactory()
    car_store = CarStore(car_factory)
    car = car_store.order('skd')
    car.run()
    car.stop()
    

     2.工厂方法设计模式

    工厂方法 把工厂类进行改进,提升为一个抽象类(接口),把对具体产品的实现交给对应的具体的子类去做,解耦多个产品之间的业务逻辑。
    from abc import ABCMeta, abstractmethod
    
    
    class Car(object, metaclass=ABCMeta):
        @abstractmethod
        def run(self):
            pass
    
        @abstractmethod
        def stop(self):
            print("蹭蹭的停车")
    
    
    class BMW(Car):
        def run(self):
            print("宝马--->吧里吧里的跑")
    
        def stop(self):
            print("宝马--->蹭蹭的停车")
    
    
    class Benz(Car):
        def run(self):
            print('奔驰-->>>吧里吧里的跑...')
    
        def stop(self):
            print('奔驰-->>>蹭蹭的停车...')
    
    
    class Skoda(Car):
        def run(self):
            print('斯柯达-->>>吧里吧里的跑...')
    
        def stop(self):
            print('斯柯达-->>>蹭蹭的停车...')
    
    
    class Factory(metaclass=ABCMeta):
        @abstractmethod
        def create_car(self):
            pass
    
    
    class BMWFactory(Factory):
        def create_car(self):
            return BMW()
    
    
    class BenzFactory(Factory):
        def create_car(self):
            return Benz()
    
    
    class SkodaFactory(Factory):
        def create_car(self):
            return Skoda()
    
    
    def test():
        bmw = BMWFactory().create_car()
        bmw.run()
        bmw.stop()
    
    
    test()
    

     3.抽象工厂设计模式

    抽象工厂  所谓抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象
    抽象工厂:
    1.抽象工厂主要目的是提供一个接口来创建一系列相关对象,而无需指定具体的类。
    2.相比于之前的需要我们去指定创建什么对象,抽象工厂不需要。
    from abc import ABCMeta, abstractmethod
    
    
    class PizzaFactory(metaclass=ABCMeta):
        # 有蔬菜的披萨
        @abstractmethod
        def create_veg_pizza(self):
            pass
    
        # 没蔬菜的披萨
        @abstractmethod
        def create_non_veg_pizza(self):
            pass
    
    
    class USAPizzaFactory(PizzaFactory):
        # USA披萨店里有蔬菜的披萨是玉米披萨
        def create_veg_pizza(self):
            return CornPizza()
    
        # USA店里没蔬菜的披萨是牛肉披萨
        def create_non_veg_pizza(self):
            return BeefPizza()
    
    
    class ChinaPizzaFactory(PizzaFactory):
        # 中国披萨店里有蔬菜的披萨是水果披萨
        def create_veg_pizza(self):
            return FruitsPizza()
    
        # 中国披萨店里没有蔬菜的披萨是羊肉披萨
        def create_non_veg_pizza(self):
            return MuttonPizza()
    
    
    # 接下来定义4种披萨和他们的父类(有蔬菜和无蔬菜)
    class VegPizza(metaclass=ABCMeta):
        @abstractmethod
        def prepare(self, veg_pizza):
            pass
    
    
    # 没蔬菜的披萨在有蔬菜的披萨上面加肉就可以
    class NonVegPizza(metaclass=ABCMeta):
        @abstractmethod
        def serve(self, veg_pizza):
            pass
    
    
    class CornPizza(VegPizza):
        def prepare(self):
            print(type(self).__name__, '来了')
    
    
    class BeefPizza(NonVegPizza):
        def serve(self, veg_pizza):
            print(type(self).__name__, '来了,牛肉是加在', type(veg_pizza).__name__, '里面的')
    
    
    class FruitsPizza(VegPizza):
        def prepare(self):
            print(type(self).__name__, '来了')
    
    
    class MuttonPizza(NonVegPizza):
        def serve(self, veg_pizza):
            print(type(self).__name__, '来了,羊肉是加在', type(veg_pizza).__name__, '里面的')
    
    
    class PizzaStore(object):
        def __init__(self):
            pass
    
        def make_pizzas(self):
            # 创建的是所有对象(所有披萨),而不是单个指定对象
            for factory in [USAPizzaFactory(), ChinaPizzaFactory()]:
                self.factory = factory
                self.non_veg_pizza = self.factory.create_non_veg_pizza()
                self.veg_pizza = self.factory.create_veg_pizza()
                # 调用
                self.veg_pizza.prepare()
                self.non_veg_pizza.serve(self.veg_pizza)
    
    
    pizza = PizzaStore()
    pizza.make_pizzas()
    

      

  • 相关阅读:
    多级导航Menu的CSS
    Centos7在线安装PostgreSQL和PostGIS
    PostGis 根据经纬度查询两点之间距离
    在PowerDesigner中表显示中添加Code的显示
    Tomcat部署Geoserver
    PostGIS之路AddGeometryColumn函数添加一个几何类型字段
    怎样把多个excel文件合并成一个
    Error:java: 无效的目标发行版: 11
    PowerDesigner导出Excel
    GeoServer发布高清电子地图
  • 原文地址:https://www.cnblogs.com/songdanlee/p/11209805.html
Copyright © 2011-2022 走看看