1.第一章 @1使用静态工厂方法代替构造函数
- >1 什么是静态工厂方法 ? 在本类中,集成类似于工厂模式的构造路线,通过自定义方法名创建对应的本对象。
- >2 它有什么好处? 1. 通俗易懂,看其方法名便知道,此对象相对于干什么用 2.对于普通不变的单一的对象,使用工厂方法,可以避免重复使用new 构建相同的对象 (实例可以参考:jdk Boolean 类中的 value of 方法)
- >3 使用场景 1.提供了另外一种类似于构造函数的方法,来构建对象 2.可以在特殊情况下来,能重复利用构造的对象 3.创建对象的多态,可以随意生成对应的子类,当然可以通过反射机制
- >4 总结: 对于构造函数提供新的一种方式,我们可以在习惯了构造函数的情况,优先使用工厂构造方法来提供相应的对象。
-
缺点: 它和普通的静态方法差不多,需要在特定情况下考虑使用。 使用前需要明确目的
强调内容 延伸: 反射机制: 优势提高灵活度,总体的速度和系统资源 缺点降低了性能(创建多态的好办法,提高灵活度 用例 spring 框架的后期,xml配置)
/**
* 静态工厂方法代码构造函数 测试静态属性,只初始化一次 c中malloc函数声请内存空间,java中使用的是new 来申请内存
* 类似于初始化表示的就是分配内存控件,然而释放java 中是gc需要做的事情,不需手动release掉
*
* @author Administrator (1)在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;
* (2)堆内存用来存放由new创建的对象和数组以及对象的实例变量。
*/
public class ChapterOne {
/**
* http://blog.sina.com.cn/s/blog_4e4dec6c0101f8ut.html 资料
* 这里详细讲述java中内存之间的关系,相当不错的文章,简短,详细
*/
private String mName;
/**
* 测试静态变量的内存位置
*/
static int testStaticInt = 0;
public int getTestStaticInt() {
return testStaticInt;
}
public ChapterOne(String name) {
mName = name;
testStaticInt++;
}
/**
* == 就是原始的Object方法中的equals方法 ==表示的是是否指向同一块内存地址
*/
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return super.hashCode();
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}
/**
* 既然设计做的是api,所以可靠性,和可利用性,便是设计人员需要思考的问题,这个数据初始化是在第一次加载类的时候
*/
public static ChapterOne defaultOne;
/**
* 这个就相当于静态工厂方法,返回一个工厂对象,既然是工厂,那么它的效率就是核心,只初始化一次对象,后面的不在初始化
*
* @return
*/
public static ChapterOne getSameChapter() {
if (defaultOne == null) {
synchronized (ChapterOne.class) {
if (defaultOne == null) {
new ChapterOne("default");
}
}
}
return defaultOne;
}
static ChapterOne d5;
static ChapterOne d6;
public static void main(String[] args) {
Boolean.valueOf("sss");// 支持多参数,构造返回对象重复利用
List<String> list = new ArrayList<>();
Collections.addAll(list, "SS", "FDFD", "FDFD");
System.out.println("size:" + list.size());
ChapterOne d1 = getSameChapter(); // d1 d2 只是一个标识符而已,本身不存在什么意思
ChapterOne d2 = getSameChapter();
System.out.println("d1 == d2 " + (d1 == d2));
System.out.println("d1 = " + d1.toString());
System.out.println("d2 = " + d2.toString());
ChapterOne d3; // d1 d2 只是一个标识符而已,本身不存在什么意思,表示的基本类型变量
ChapterOne d4;
// System.out.println(d3.equals(d4)); //报错表示标识符,只有通过了赋值(初始化),在存在其意义
System.out.println(d5.equals(d6)); // 全局变量默认赋初值,初值为null,表示不分配内存
}
}