單例模式
單例模式五種實現(xiàn):
1.餓漢模式:
public class Singleton {
private final static Singleton SINGLETON = new Singleton();
private Singleton() {
}
public static Singleton getInstance(){
return SINGLETON;
}
}
- 優(yōu)點:
- 單例對象的創(chuàng)建是線程安全的;
- 獲取單例對象時不需要加鎖暑诸。
- 缺點:單例對象的創(chuàng)建余赢,不是延時加載宿稀。
2.懶漢模式:
public class Singleton {
private static Singleton SINGLETON;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (SINGLETON == null) {
SINGLETON = new Singleton();
}
return SINGLETON;
}
}
- 優(yōu)點:
- 對象的創(chuàng)建是線程安全的。
- 支持延時加載嵌洼。
- 缺點:獲取對象的操作被加上了鎖案疲,影響了并發(fā)度。
- 如果單例對象需要頻繁使用麻养,那這個缺點就是無法接受的褐啡。
- 如果單例對象不需要頻繁使用,那這個缺點也無傷大雅鳖昌。
3.雙重檢查:
public class Singleton {
// Java 1.4 及更早的版本中有些問題备畦,就是指令重排序,需要給 SINGLETON 成員變量加上 volatile 關(guān)鍵字
private static Singleton SINGLETON;
private Singleton() {
}
public static Singleton getInstance() {
if (SINGLETON == null) {
synchronized (Singleton.class) {
if (SINGLETON == null) {
SINGLETON = new Singleton();
}
}
}
return SINGLETON;
}
}
雙重檢測單例優(yōu)點:
- 對象的創(chuàng)建是線程安全的遗遵。
- 支持延時加載萍恕。
- 獲取對象時不需要加鎖。
4.靜態(tài)內(nèi)部類
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
private static Singleton SINGLETON = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.SINGLETON;
}
}
外部類 Singleton 加載時车要,不會創(chuàng)建 SingletonHolder 實例對象,只有調(diào)用 getInstance() 方法時崭倘,SingletonHolder 才會被加載翼岁,才會創(chuàng)建 SINGLETON 對象,SINGLETON 對象的線程安全和唯一性由 JVM 來保證司光。
靜態(tài)內(nèi)部類單例優(yōu)點:
- 對象的創(chuàng)建是線程安全的琅坡。
- 支持延時加載。
- 獲取對象時不需要加鎖残家。
5.枚舉:
public enum Singleton {
SINGLETON; // 該對象全局唯一
}
工廠方法模式
簡單工廠模式:是對產(chǎn)品的抽象榆俺,工廠根據(jù)傳入標(biāo)識生產(chǎn)各種類型的產(chǎn)品
public interface Phone {
void make();
}
public class IPhone implements Phone {
@Override
public void make() {
// 生產(chǎn) IPhone
}
}
public class MiPhone implements Phone {
@Override
public void make() {
// 生產(chǎn) MiPhone
}
}
public class PhoneFactory {
public Phone PhoneMake(String type) {
if ("MiPhone".equals(type)) {
return new MiPhone();
} else {
return new IPhone();
}
}
}
工廠方法模式:是對工廠的抽象,根據(jù)需要生成的產(chǎn)品坞淮,先生成對應(yīng)的工廠茴晋,然后由工廠生成產(chǎn)品。
interface Factory {
void makePhone();
}
public class MiFactory implements Factory {
@Override
public void makePhone() {
// 生產(chǎn)MiPhone
}
}
public class IPhoneFactory implements Factory {
@Override
public void makePhone() {
// 生產(chǎn)IPhone
}
}
public class Test{
public static void main(String[] args) {
Factory factory = new MiFactory();
factory.makePhone();
}
}
抽象工廠模式:上面兩種都是對單一產(chǎn)品族回窘,如果多類工廠對應(yīng)多類產(chǎn)品族诺擅,需要對產(chǎn)品和工廠都進(jìn)行抽象
// Phone產(chǎn)品族
interface Phone {
}
public class MiPhone implements Phone {
}
public class IPhone implements Phone {
}
// PC產(chǎn)品族
interface PC {
}
public class MiPC implements PC {
}
public class MAC implements PC {
}
// 工廠抽象
interface Factrory {
Phone makePhone();
PC makePC();
}
// Mi工廠
public class MiFactrory implements Factrory {
@Override
public Phone makePhone() {
return new MiPhone();
}
@Override
public PC makePC() {
return new MiPC();
}
}
// MAC工廠
public class MACFactrory implements Factrory {
@Override
public Phone makePhone() {
return new IPhone();
}
@Override
public PC makePC() {
return new MAC();
}
}
建造者模式
簡化版建造者模式,傳統(tǒng)的建造者模式會對Builder進(jìn)行抽象啡直,方便創(chuàng)建復(fù)雜的對象烁涌,比如 name 或者 age 是個復(fù)雜對象,同時還需要一個協(xié)調(diào)者來生成對象酒觅。
public class Human {
String name;
String age;
String need;
public Human(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.need = builder.need;
}
public static class Builder {
String name;
String age;
String need;
public Builder(String need) {
this.need = need;
}
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setAge(String age) {
this.age = age;
return this;
}
public Human build() {
return new Human(this);
}
}
public static void main(String[] args) {
Human human = new Builder("need")
.setName("name")
.setAge("age")
.build();
}
}
原型模式
基于已有的對象創(chuàng)建重復(fù)對象撮执,同時又能保證性能
實現(xiàn)方式,在需要被重復(fù)創(chuàng)建的對象的類上實現(xiàn)clone接口即可舷丹,如果是深度克隆抒钱,需要單獨處理嵌套對象。例如數(shù)組對象,需要循環(huán)拷貝每個對象继效。