我目前正在审查设计模式。我遇到了这个Multiton,但我发现很难想出一个好的现实世界用法示例。
那么Multiton模式优势的主要应用领域是什么?
答案 0 :(得分:4)
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
这是多音,一个现实生活中的例子
答案 1 :(得分:1)
Multiton
是一种设计模式,可确保在多线程环境中仅为Key 创建一个对象。因此,如果多个线程尝试传递相同的密钥,则应为该密钥获取相同的对象(锁定对象)。可能我们称之为基于密钥的单身人士。
如果我们在整个系统中只有一个锁定对象;那么你的申请是singleTon
。但这里有多个锁定对象;每个对象用一个键映射。
一个例子是;假设有多个会议,并且您希望允许会议的呼叫者逐个加入(以计算会议中的呼叫者数量)(每个会议同步对象)及其各自的conferenceID。如果我有单身对象,那么即使来自不同会议的呼叫者也会被阻止。所以我需要锁定每个会议。
因此,应根据会议ID创建会议锁定对象;当多个线程试图访问具有相同会议ID(多通道密钥)的同一会议对象时,最终应该在系统中进行同步。因此,如果两个呼叫者同时拨打同一个会议,则会同步。
class LockByKey {
ObjectForStringKey objHolder = new ObjectForStringKey(100);
public void lockThenWorkForKey (String key) {
synchronized(objHolder.valueOf(key)){
//DoSomeWork
}
}
}
//MultiTon
public final class ObjectForStringKey {
private final Object[] cache;
private final int cacheSize;
final int mask;
public ObjectForStringKey(int size) {
// Find power-of-two sizes best matching arguments
int ssize = 1;
while (ssize < size) {
ssize <<= 1;
}
mask = ssize - 1;
cache = new Object[ssize];
cacheSize = ssize;
//build the Cache
for (int i = 0; i < cacheSize; i++) {
this.cache[i] = new Object();
}
}
public Object valueOf(String key) {
int index = key.hashCode();
return cache[index & mask];
}
}
答案 2 :(得分:0)
我认为Java ScriptEngine
的例子就是一个很好的例子:
// For nashorn
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
// For rhino
ScriptEngine engine = new ScriptEngineManager().getEngineByName("rhino");
Nashorn和rhino都是(通用)ScriptEngine
,只有参数显示使用了哪个实现。
答案 3 :(得分:0)
另一个例子:
假设您有一些监控摄像头,每个摄像头可以只有一个控制器。
在这种情况下,你应该获得相机类multiton。它有一个包含<key, camera>
对的哈希映射。像:
public sealed class Camera
{
static Dictionary<int, Camera> _cameras = new Dictionary<int, Camera>();
static object _lock = new object();
private Camera()
{
HardwareId = Guid.NewGuid();
}
public static Camera GetCamera(int cameraCode)
{
lock (_lock)
{
if (!_cameras.ContainsKey(cameraCode)) _cameras.Add(cameraCode, new Camera());
}
return _cameras[cameraCode];
}
public Guid HardwareId { get; private set; }
}
答案 4 :(得分:0)
只是添加到答案中,
我正在从 Cracking The Coding Interview 书中创建一个名为 OTHello 的游戏, 只有两个玩家,一个是白人玩家,另一个是黑人玩家。
所以我有一个 Player 类,每个游戏应该只有两个实例。每个实例都应该有黑色或白色。在创建了两个玩家之后,棋盘就像一个包含所有玩家、硬币、点数等的类,ETC 不应该有更多玩家打断,所以这种模式会阻止这种情况发生。
同样的道理也适用于国际象棋,在一个棋盘类实例中只能有两个玩家类实例。