import java.text.DateFormat;
import java.text.NumberFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import org.junit.Test;
/**
*--------唯有专注才能深入,唯有厚积才会薄发---------
* 本类介绍:
* @author : 木木老师
* @Time : 2017年7月27日 下午7:13:25
* @QQ : 1349211393
*/
public class SimpleFactoryDemo {
@Test
protected void method1() {
//介绍几个简单工厂案例。
DateFormat dateFormat=DateFormat.getInstance();
Date date=new Date();
System.out.println(dateFormat.format(date)+"\n");
/*
* Java开发者对java.util.Date 笨拙的设计,忍耐以及达到了极限了。
* Java 8.0带来了全新的日期和时间的API,
* 在java.time包中引入了一系列有用的新的类。
* 如:LocatDate ,LocalTime和LocalDateTime等等,
* 解决了哪些久被诟病的问题。
*/
//这些都是一个工厂方法。你可以点击源码去看。
System.out.println(LocalDate.now());
/*
public static LocalDate now() {
return now(Clock.systemDefaultZone());
}
静态:每个类只有一个静态域,但是静态域中可以有多个静态的变量。而每个对象对于所有的实例域都有一份自己的拷贝。
这个域中出现的所有的变量都是共有的。静态变量使用很少,静态常量使用很多,也是这个原因。静态变量的数据是可变的。
如果创建了大量的对象,难道该类的所有对象都要进行数据变化吗?
经常使用的数据,我们经常会把它当成静态常量或者做成枚举类。
一. 静态方法的: 优点
1.使用静态工厂方法对比构造方法,构造方法 的缺陷,必须要和类名相同,无法重新命名。
所以.静态工厂方法就可以重新命名,更加易于我们来理解代码。
2.静态工厂方法在每次调用的时候不要求创建一个新的对象。
这种做法对于一个要频繁创建相同对象的程序来说,可以极大的提高性能。
它使得一个类可以保证是一个singleton;他使非可变类可以保证“不会有两个相等的实例存在”。
静态工厂本身就是属于类的,每个对象的拷贝都原来的那一份数据。绝对是一个单例。
3.静态工厂方法在选择返回类型时有更大的灵活性。
使用静态工厂方法,可以通过调用方法时使用不同的参数创建不同类的实例,
还可以创建非公有类的对象,这就封装了类的实现细节。
二. 静态方法的: 缺点
1.如果一个类是通过静态工厂方法来取得实例,并且该类的构造函数都不是公有的或者保护的(非public,protected)即default和private,当
你的方法是default和private的,我的子类是无法访问的。
参考资料:
访问权限定义了: 类 包 子类 其他包 的访问权限。
public OK OK OK OK
protected OK OK OK NO
》》》》关注一下,下面的2种:
default OK OK NO NO
private OK NO NO NO
那该类就不可能有子类(被继承),子类的构造函数需要首先调用父类的构造函数,
因为父类的构造函数是private的,所以即使我们假设继承成功的话,
那么子类也根本没有权限去调用父类的私有构造函数,所以是无法被继承的。
2.毕竟通过构造函数创建实例还是SUN公司所提倡的,
静态工厂方法跟其他的静态方法区别不大,这样创建的实例谁又知道这个静态方法是创建实例呢?
弥补的办法就是:静态工厂方法名字使用valueOf或者getInstance.
总结:静态工厂方法和公有的构造函数都有他们各自的用途,我们要理解他们各自的长处,
避免一上来就用构造函数,通常静态工厂更加合适。如果没有其他因素强烈的影响我们的选择,最好还是简单的选择构造函数,毕竟他是语言提供的规范。
*/
System.out.println(LocalDateTime.now().hashCode());
System.out.println(LocalDateTime.now().hashCode());
System.out.println(LocalDateTime.now());
System.out.println(LocalDateTime.now());
System.out.println(LocalDateTime.now());
/*
public static LocalDateTime now() {
return now(Clock.systemDefaultZone());
}
*/
NumberFormat numberFormat=NumberFormat.getInstance();
NumberFormat PercentFormat=NumberFormat.getPercentInstance();
double num=2.3;
System.out.println(numberFormat.format(num)+"\n"+PercentFormat.format(num));
}
}
简单工厂代码
最新推荐文章于 2024-04-04 13:14:32 发布