建設(shè)企業(yè)高端網(wǎng)站/電商引流推廣方法
1.單例模式
單例模式主要用于某個類有且只能用一個對象的場景,單例模式下不能外部實例化對象,由類內(nèi)部自行私有化實例對象并提供一個可以獲得該對象的方法。單例模式主要有餓漢模式(安全,但在編譯時就會自動創(chuàng)建對象,即使不使用對象也會存在,會造成一定資源的浪費)、懶漢模式(安全,通過synchroized鎖實現(xiàn),每次獲取對象時都會加鎖,會對性能有一定影響)、DCL模式(基本安全,通過synchroized鎖實現(xiàn),在獲取對象的方法內(nèi)部加鎖,當(dāng)已經(jīng)實例化對象時不會加鎖直接返回對象,但在極少數(shù)情況下會出現(xiàn)線程不安全的情況)、靜態(tài)內(nèi)部類模式(安全,在類內(nèi)定義一個靜態(tài)的私有化的類來實例化對象)。
餓漢模式:
public class CEO {private static final mCEO = new CEO();//私有化實例化對象private CEO() { }//私有化構(gòu)造方法public static CEO getCEO() {return mCEO;}//提供獲取對象的接口
}
懶漢模式:
public class CEO {private static CEO mCEO;private CEO() { }public static synchroized CEO getCEO() {if(mCEO == null) {mCEO = new CEO(); }return mCEO;}//synchroized,加同步鎖,保證唯一;
}DCL模式:
public class CEO {private static CEO mCEO = null;private CEO() { }public static CEO getCEO() {if(mCEO == null) {synchroized(CEO.class) {if(mCEO == null) {mCEO = new CEO();}}}return mCEO;}
}靜態(tài)內(nèi)部類模式:當(dāng)外部類被加載時,靜態(tài)內(nèi)部類不會立即加載,只有在第一次調(diào)用內(nèi)部類的靜態(tài)成員或方法時才會加載,這樣實現(xiàn)了懶加載的效果。同時,類加載過程是線程安全的,因此靜態(tài)內(nèi)部類單例模式也是線程安全的
public class CEO {private CEO() { }public static CEO getCEO() {return CEOInstance.mCEO;}//靜態(tài)內(nèi)部類private static class CEOInstance {private static final CEOInstance mCEO = new CEO();}
}
2.構(gòu)建者模式
用于創(chuàng)建復(fù)雜對象,將對象的創(chuàng)建與表示分離、按步奏創(chuàng)建對象,通常包含以下角色。
產(chǎn)品(Product)——要創(chuàng)建的復(fù)雜對象,一般包含多種屬性;
抽象構(gòu)建者(Abstract Builder)——創(chuàng)建產(chǎn)品的各個抽象方法,以及返回最終產(chǎn)品的方法;
具體構(gòu)建者(Concrete Builder)——負(fù)責(zé)產(chǎn)品的具體創(chuàng)建,以及最終產(chǎn)品的返回;
指導(dǎo)者(Director)——使用構(gòu)建者構(gòu)建產(chǎn)品;
public class Product {private String partA;private Int partB;private Double partC;public get();//相應(yīng)參數(shù)的get方法public set();//相應(yīng)參數(shù)的set方法
}
public interface Builder {void buildPartA(String part);void buildPartA(Int part);void buildPartA(Double part);Product getProduct();
}
public ConcreteBuilder implements Builder {private Product product;public ConcreteBuilder() {product = new Product();}@Overridepublic void buildPartA(String part) {product.setPartA(part);}@Overridepublic void buildPartA(Int part) {product.setPartB(part);}@Overridepublic void buildPartA(Double part) {product.setPartC(part);}@Overridepublic Product getProduct() {return product;}
}
public class Director {private Builder builder;public void setBuilder(Builder builder) {this.builder = builder;}public Product concreteProduct() {builder.builderPartA("partA");builder.builderPartB(45);builder.builderPartC(1.44);return builder.getProduct();}
}
//實際使用
ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director();
director.setBuilder(builder);
Product product = director.concreteProduct();
3.工廠模式
特點:向上轉(zhuǎn)換思想;不直接new對象,子類具體決定實例化什么對象;
應(yīng)用:需要生成復(fù)雜對象的地方;
角色:抽象工廠、具體工廠、抽象產(chǎn)品、具體產(chǎn)品;
通用模式寫法:
抽象工廠——定義一個返回抽象產(chǎn)品的抽象方法,該方法負(fù)責(zé)構(gòu)造產(chǎn)品;
具體工廠——重寫構(gòu)造產(chǎn)品的方法,返回對象為具體產(chǎn)品;
抽象產(chǎn)品——定義一個抽象方法,該方法與產(chǎn)品關(guān)聯(lián);
具體產(chǎn)品——根據(jù)具體產(chǎn)品重寫父類中與產(chǎn)品關(guān)聯(lián)的抽象方法;
//抽象產(chǎn)品
public abstract class Product{public abstract void fuction();
}
//具體產(chǎn)品A
public class ProductA extends Product{@Override public void function() {system.out.println("產(chǎn)品A的功能是...");}
}
//具體產(chǎn)品B
public class ProductB extends Product{@Override public void function() {system.out.println("產(chǎn)品B的功能是...");}
}//抽象工廠寫法
public abstract class Factory{public abstract Product createProduct();
}
//具體工廠寫法
public ConcreteFactoryA extends Factory {@Overridepublic ProductA createProduct() {return new ProductA();}
}
public ConcreteFactoryB extends Factory {@Overridepublic ProductB createProduct() {return new ProductB();}
}
//客戶or測試
public class Client{public static void main(String[] args) {Factory factory = new ConcerateFactoryA(); Product product = factory.createProduct();product.fuction();}
}