【问题标题】:Flyweight/OOP design patterns in JuliaJulia 中的享元/OOP 设计模式
【发布时间】:2019-08-05 14:09:26
【问题描述】:

来自面向对象的框架 (Python) 并尝试在 Julia 中实现享元模式 (https://en.wikipedia.org/wiki/Flyweight_pattern)

考虑到 Julia 中的多重分派框架和缺乏继承性,不太确定如何做到这一点。想知道是否有任何 Julia 专家考虑过主要面向对象的设计模式(例如 Gang of Four)的实现以及如何将它们移植到 Julia(或者如果没有,是否有任何替代方案)

【问题讨论】:

    标签: oop design-patterns julia


    【解决方案1】:

    在 Julia 世界中,最好的等价物似乎是 Memoize

    using Memoize                                                                       
    @memoize function x(a)                                           
        println("Computing or constructing a big data structure...")
        (a=a, b=2a)                                          
    end
    

    现在让我们测试这段代码

    julia> x(7)                                                             
    Computing or constructing a big data structure...
    (a = 7, b = 14)                                                         
    
    julia> x(7)                                                             
    (a = 7, b = 14)                                                         
    

    请注意,在第二次运行中,我们只是获得了对同一个对象的引用。因此,无论您运行多少次x(7),结果都只会占用一次内存。

    【讨论】:

      【解决方案2】:

      当我过去这样做时,我明确地将享元作为常量引用。 然后我们显式定义引用享元的数据结构的构造函数来使用共享资源。

      使用来自维基百科的标准奶酪店模型:

      struct CheeseSupplier
        stock::Dict{String,Float64}
        CheeseSupplier() = new(Dict())
      end
      
      stock(supplier, name, price) = supplier.stock[name] = price
      
      const supplier = CheeseSupplier()
      
      struct CheeseShop
        orders::Dict{String,Int64}
        supplier::CheeseSupplier
        CheeseShop() = new(Dict(), supplier)
      end
      
      totalincome(shop) = foldl((x,(k,v)) -> x + shop.supplier.stock[k]*v, shop.orders; init=0)
      
      function sell(shop, name, amount)
        haskey(shop.supplier.stock, name) || error("Supplier doesn't have $(name)")
        shop.orders[name] = get(shop.orders, name, 0) + amount
      end
      
      shop1 = CheeseShop()
      shop2 = CheeseShop()
      stock(supplier, "blue", 3.75)
      sell(shop1, "blue", 3)
      sell(shop2, "blue", 8)
      

      【讨论】:

        猜你喜欢
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        • 2016-03-25
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多