Multiton

Revision as of 15:10, 13 September 2021 by PureFox (talk | contribs) (Created new draft task, Multiton, and added a Wren solution.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

The multiton pattern is a design pattern which generalizes the singleton pattern. Whereas the singleton allows only one instance of a class to be created, the multiton pattern allows for the controlled creation of multiple instances, which it manages through the use of a map.

Multiton is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Description


Task

Implement a basic Multiton class or other structure and test that it works as intended. If your language does not support the object oriented paradigm, then try to emulate a multiton as best you can with the tools available.

If your language supports multithreading, then you may optionally implement a thread safe variant as well.


Related task



Wren

Library: Wren-dynamic

This more or less follows the lines of the Java example in the linked Wikipedia article.

Although all Wren code runs within the context of a fiber (of which there can be thousands) only one fiber can run at a time and so the language is effectively single threaded. Thread-safety is therefore never an issue. <lang ecmascript>import "/dynamic" for Enum

var MultitonType = Enum.create("MultitonType", ["zero", "one", "two"])

class Multiton {

   // private constructor
   construct new_(type) {
       _type = type
   }
   static getInstance(type) {
       if (!(0...MultitonType.members.count).contains(type)) {
           Fiber.abort("Invalid MultitonType member.")
       }
       if (!__instances) __instances = {}
       if (!__instances.containsKey(type)) __instances[type] = new_(type)
       return __instances[type]
   }
   type { _type }
   toString { MultitonType.members[_type] }

}

var m0 = Multiton.getInstance(MultitonType.zero) var m1 = Multiton.getInstance(MultitonType.one) var m2 = Multiton.getInstance(MultitonType.two)

System.print(m0) System.print(m1) System.print(m2)

var m3 = Multiton.getInstance(3) // produces an error</lang>

Output:
zero
one
two
Invalid MultitonType member.
[./multiton line 13] in getInstance(_)
[./multiton line 33] in (script)