1 单例模式
- 如果构造方法私有化,那么想要在类的外部构建对象是不可能的,所以需要通过静态方法获取类的对象,如果获取对象时,这个对象只创建一次,那么这样的对象我们称之为单例对象
我们先看Java的
1.1 Java饿汉式
public class Java02_Single {
private static Java02_Single instance = new Java02_Single();
private Java02_Single(){
}
private static Java02_Single getInstance(){
return instance;
}
}
1.2 Java懒汉式
public class Java02_Single {
private static Java02_Single instance = new Java02_Single();
private Java02_Single(){
}
private static Java02_Single getInstance(){
if(instance == null){
/*
不能什么对象调用的时候都新赋值
只有对象是null的时候才新建对象
*/
instance = new Java02_Single();
}
return instance;
}
}
1.3 改良版Java懒汉式
private Java02_Single() {}
/*
使用静态内部类;
解决线程安全、并发问题;
*/
private static class SingletonInstance {
// 类不加载,也不会创建下面这个对象;也不会占用空间;是饿汉模式
private static final Java02_Single INSTANCE = new Java02_Single();
}
public static Java02_Single getInstance() {
return SingletonInstance.INSTANCE;
}
1.4 Scala单例模式
object Scala03_Single{
def test()={
println("测试")
}
}
/**
* 利用伴生对象(类对象)
*/
object SingleTest{
def main(args: Array[String]): Unit = {
Scala03_Single.test()
}
}
2 伴生对象
在 Scala 中,如果在同一个源码文件中,同时存在使用 object 声明的类对象(Person)以及使用 class 声明的类(Person),那么这个类对象就是该类的伴生对象,而这个类就是这个类对象的伴生类。
// person.scala
class Person { // 伴生类
}
object Person { // 伴生对象
}
- 注: 类和它的伴生对象可以相互访问私有属性或方法,他们必须存在同一个源文件中。必须同名。
- 从技术的角度来讲, 伴生对象和伴生类其实是两个不同的类, 伴生对象所对应的类可以简答的理解为伴生类的辅助工具类。而伴生对象就是这个辅助工具类的单例对象,专门用于处理伴生类中静态资源的相关功能.
- 伴生对象既然是一个单例对象,就意味着类已经声明过了,所以,伴生(类)对象是不能声明构造器的
3 apply 方法
- 因为伴生对象可以处理静态资源,所以完全可以通过伴生对象提供的方法对伴生类进行处理
增加 apply 方法,构建伴生类实例
class Scala04_Apply {
def this(n:String){
this()
}
}
object Scala04_Apply{
def apply(): Scala04_Apply = { //在伴生对象中实现 apply 方法。
return new Scala04_Apply() // 这里也可以采用单例模式实现
}
def apply(n:String): Scala04_Apply = {
new Scala04_Apply(n)
}
}
object ApplyTest{
def main(args: Array[String]): Unit = {
val apObj = Scala04_Apply()
/*
此处不需要使用 new 关键字,而是直接增加小括号,在执行时,会
自动调用伴生对象中的 apply 方法。返回伴生类实例对象
*/
val apObj2 = Scala04_Apply("李四")
println(apObj)
println(apObj2)
}
}
com.nefu.scala.chaptor03.Scala04_Apply@35851384
com.nefu.scala.chaptor03.Scala04_Apply@649d209a
Process finished with exit code 0
4 枚举对象
枚举是穷举的意思,把所有的可能的对象都创建出来。
解决逻辑混乱问题,把可能性都规定出来。
枚举就是单例模式的多例版。
Scala 中没有枚举类型,定义一个扩展 Enumeration 类的对象,并以 Value 调用初始化枚举中的所有可能值,模拟枚举类型。
object LightColorEnum extends Enumeration {
//扩展了一个Enumeration的特质
val Red = Value(0, "Stop") //用value类型简介实现。
val Yellow = Value(1, "Slow")
val Green = Value(2, "Go")
}
object ApplyTest{
def main(args: Array[String]): Unit = {
println(LightColorEnum.Red)
}
}
Stop
Process finished with exit code 0