仓颉设计模式-单例模式

一、单例模式概述

1.单例模式定义

        单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这种模式常用于需要控制资源访问或共享资源的清况。

2.单例模式特点

  • 唯一实例:单例类只能有一个实例
  • 全局访问:通过一个全局访问点获取该实例
  • 延迟初始化:实例在第一次被请求时才创建

二、饿汉式单例

        所谓饿汉式单例是,不管需不需要该对象,这个对象都会在程序中生成。

public class Employee{
    static var emp : Employee = Employee() 
    private Employee()
    {
        println("创建对象")
    }
    public static func createEmp():Employee
    {
        emp
    }
}
main(): Int64 {
    var emp1 = Employee.createEmp()
    var emp2 = Employee.createEmp()
    return 0
}

结果为:

        在主函数中创建了两个实例对象,可运行的结果只有一个,故为单例模式。在类中用静态修饰符创建对象再将主构造函数私有,通过静态函数访问,在主函数中通过类名进行访问,根据静态变量只初始化一次,程序只会创建一个对象,然后又因为在类中已经将实例对象初始化,因此不管需不需要这个对象都已经在程序中被创建,故为饿汉式单例。

三、懒汉式单例

        所谓懒汉式单例是,需要你创建该对象时,程序再去创建对象。

public class Employee{
    static var emp : Employee
    static init()
    {
        println("创建对象")
        emp = Employee()
    } 
    public static func createEmp():Employee
    {
        emp
    }
}
main(): Int64 {
    var emp1 = Employee.createEmp()
    var emp2 = Employee.createEmp()
    return 0
}

结果为:

        该程序的运行结果也只有一个实例对象,将实例对象用静态变量修饰,在静态构造函数中初始化,静态变量只初始化一次,并且静态构造函数只能有一个而且只执行一次,保证了只创建一个实例对象,并且在类中并没有实例化对象,而是在静态构造函数中进行初始化,所以实现了需要创建该对象时,程序才会去创建该对象。

在实际开发过程中,通常会用到懒汉式单例,但也要根据实际的需求合适选择设计模式。

提供的参考引用中未涉及使用仓颉编程语言解决0 - 1背包问题的内容,不过可依据常见的动态规划思路来给出一个可能的仓颉编程语言实现0 - 1背包问题的代码示例。0 - 1背包问题是一个经典的组合优化问题,核心是在给定容量的背包和一组物品(每个物品有对应的重量和价值)的情况下,选择物品放入背包,使得背包内物品的总价值最大,且每个物品只能选择放入或不放入。 下面是使用仓颉编程语言实现0 - 1背包问题的可能代码示例: ``` // 假设这是仓颉编程语言的语法,用于定义一个解决 0 - 1 背包问题的函数 function knapsack(capacity: Int64, weights: Array<Int64>, values: Array<Int64>): Int64 { let n: Int64 = weights.length; var dp: Array<Array<Int64>> = Array<Array<Int64>>(n + 1, Array<Int64>(capacity + 1, 0)); for (var i: Int64 = 1; i <= n; i++) { for (var w: Int64 = 1; w <= capacity; w++) { if (weights[i - 1] <= w) { dp[i][w] = max(values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w]); } else { dp[i][w] = dp[i - 1][w]; } } } return dp[n][capacity]; } // 主函数调用示例 main(): Int64 { let capacity: Int64 = 5; let weights: Array<Int64> = [2, 3, 4]; let values: Array<Int64> = [3, 4, 5]; let result: Int64 = knapsack(capacity, weights, values); return result; } ``` 上述代码中,`knapsack` 函数接收背包的容量 `capacity`、物品的重量数组 `weights` 和物品的价值数组 `values` 作为参数。使用二维数组 `dp` 来存储子问题的解,通过两层循环遍历物品和背包容量,根据当前物品是否能放入背包来更新 `dp` 数组的值,最终返回 `dp[n][capacity]` 作为最大价值。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值