舉例講解Python設計模式編程的代理模式與抽象原廠模式

來源:互聯網
上載者:User
代理模式
Proxy模式是一種常用的設計模式,它主要用來通過一個對象(比如B)給一個對象(比如A) 提供'代理'的方式方式訪問。比如一個對象不方便直接引用,代理就在這個對象和訪問者之間做了中介

你先設想:一個對象提供rgb三種顏色值,我想獲得一個對象的rgb三種顏色,但是我不想讓你獲得藍色屬性,怎麼辦?

class Proxy(object):  def __init__(self, subject):    self.__subject = subject  # 代理其實本質上就是屬性的委託  def __getattr__(self, name):    return getattr(self.__subject, name)class RGB:  def __init__(self, red, green, blue):    self.__red = red    self.__green = green    self.__blue = blue  def Red(self):    return self.__red  def Green(self):    return self.__green  def Blue(self):    return self.__blueclass NoBlueProxy(Proxy):  # 我在這個子代理類攔截了blue的訪問,這樣就不會返回被代理的類的Blue屬性  def Blue(self):    return 0if __name__ == '__main__':  rgb = RGB(100, 192, 240)  print rgb.Red()  proxy = Proxy(rgb)  print proxy.Green()  noblue = NoBlueProxy(rgb)  print noblue.Green()  print noblue.Blue()

抽象原廠模式
和簡單工廠/Factory 方法不同,抽象工廠可能最好理解,舉個例子:
比如2個動物,貓和狗,他們都有speak和eat的function,但是很明顯他們執行的結果是不同的 有個'工廠'(抽象工廠裡面一個類型就是一個工廠,這點和其他模式的不同)專門協助我們找到對應的動物做正確的操作 有個類/函數可以通過參數協助我們找到上面的這個工廠 這就是抽象工廠

from abc import ABCMetaclass StandardFactory(object):  '''這就是那個抽象工廠'''  @staticmethod  def get_factory(factory):    '''根據參數找到對實際操作的工廠'''    if factory == 'cat':      return CatFactory()    elif factory == 'dog':      return DogFactory()    raise TypeError('Unknown Factory.')這裡協助dog這個產品類找到應該的屬性的工廠class DogFactory(object):  def get_pet(self):    return Dog();class CatFactory(object):  # 注意這個方法和上面的名字一樣,但是返回的類不同,這就是工廠的作用  def get_pet(self):    return Cat();# 可以認為dog和cat都是動物的一種,可以有個基類class Pet(object):  # ABCMeta會讓這個類在註冊後添加很多基礎抽象基類,可以看[ABCMeta](http://docs.python.org/2/library/abc.html#abc.ABCMeta)  __metaclass__ = ABCMeta  def eat(self):    pass# Dog應該做什麼就是這裡class Dog(Pet):  def eat(self):    return 'Dog food...'class Cat(Pet):  # 這裡的eat依然是同名,她們都是同樣的操作,只是返回不同  def eat(self):    return 'Cat food...'if __name__ =="__main__":  factory = StandardFactory.get_factory('cat')  pet = factory.get_pet()  print pet.eat()  # 注意這裡,你只需要修改抽象工廠傳入的那個參數,其他什麼都不用改  factory = StandardFactory.get_factory('dog')  pet = factory.get_pet()  print pet.eat()
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.