目录

一、练习题

二、小结


一、练习题

1. 有一个负载均衡器,可以将并发访问的数据分发到不同的服务器集群并发处理,为了确保服务器状态一致,需要保证负载均衡器的唯一性,你该怎么设计该负载均衡器?

类图

饿汉式单例

核心代码

package DesignPattern.singleton
import std.collection.*
import std.random.Random

// 饿汉式单例
public class LoadBalancer {
    private static let loadBalancer: LoadBalancer = LoadBalancer()

    // 模拟服务器集群
    private let serverList:ArrayList<String>

    private init() {
        serverList = ArrayList<String>()
    }

    public static func getLoadBalancer() {
        return loadBalancer
    }

    public func addServer(serverName: String) {
        serverList.add(serverName)
    }

    public func showServer() {
        let index = Random().nextInt64(serverList.size)
        println("数据分发到${serverList[index]}")
    }
}

测试代码

package DesignPattern
import DesignPattern.singleton.*
 
main(): Int64 {
    let loadBalancer = LoadBalancer.getLoadBalancer()
    loadBalancer.addServer("服务器: 1")
    loadBalancer.addServer("服务器: 2")
    loadBalancer.addServer("服务器: 3")
    loadBalancer.addServer("服务器: 4")
    for (_ in 0..10) {
        loadBalancer.showServer()
    }


    return 0
}

懒汉式单例

核心代码

package DesignPattern.singleton
import std.collection.*
import std.random.Random
import std.sync.*
// 可重入互斥锁
let mutex = Mutex()

// 懒汉式单例
public class LoadBalancer {
    private static var loadBalancer: Option<LoadBalancer> = Option<LoadBalancer>.None

    // 模拟服务器集群
    private let serverList:ArrayList<String> = ArrayList<String>()

    public static func getLoadBalancer() {
        if (loadBalancer.isNone()) {
            synchronized (mutex) {
                if (loadBalancer.isNone()) {
                    loadBalancer = LoadBalancer()
                }
            }
        }
        return loadBalancer
    }

    public func addServer(serverName: String) {
        serverList.add(serverName)
    }

    public func showServer() {
        let index = Random().nextInt64(serverList.size)
        println("数据分发到${serverList[index]}")
    }
}

测试代码

package DesignPattern
import DesignPattern.singleton.*
 
main(): Int64 {
    let optLoadBalancer = LoadBalancer.getLoadBalancer()
    match (optLoadBalancer) {
        case Some(loadBalancer) => 
            loadBalancer.addServer("服务器: 1")
            loadBalancer.addServer("服务器: 2")
            loadBalancer.addServer("服务器: 3")
            loadBalancer.addServer("服务器: 4")
            for (_ in 0..10) {
                loadBalancer.showServer()
            }
        case None => println("分发失败")
    }

    return 0
}

二、小结

本章为大家详细的介绍了仓颉设计模式中单例模式练习题的内容,下一章,为大家带来原型模式的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐