創(chuàng)建型模式
設(shè)計模式【GoF23】
是一套用來提高代碼復用性、可維護性、可讀性、穩(wěn)健性以及安全性的解決方案。
優(yōu)點:①提高程序員的思維能力、編程能力和設(shè)計能力。②使程序設(shè)計更加標準化、代碼編制更加工程化,使軟件開發(fā)效率大大提高,從而縮短軟件的開發(fā)周期。
| 類型 | 模式 |
|---|---|
| 創(chuàng)建型模式 | 單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式 |
| 結(jié)構(gòu)型模式 | 適配器模式、橋接模式 、裝飾模式、組合模式、外觀模式、享元模式、代理模式 |
| 行為型模式 | 模板方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式、狀態(tài)模式、策略模式、職責鏈模式、訪問者模式 |
OOP七大原則:
- 開比原著:對擴展開放,對修改關(guān)閉
- 里氏替換原則:繼承必須確保超類所擁有的性質(zhì)在子類中仍成立
- 依賴倒置原則:要面向接口,不要面向?qū)崿F(xiàn)編程
- 單一職責原則:控制類的粒度大小、將對象解耦、提高其內(nèi)聚性
- 接口隔離原則:要為各個類建立他們專用的接口
- 迪米特法則:只與你的直接朋友交談
- 合成復用原則:盡量先使用組合或聚合等關(guān)聯(lián)關(guān)系來實現(xiàn),其次才考慮使用繼承關(guān)系來實現(xiàn)
1.單例模式
-
餓漢式單例:直接加載對象,浪費空間
-
懶漢式單例【DCL】:實例為空時才創(chuàng)建,在多線程下會發(fā)生錯誤,因此需要雙重檢測鎖控制
2.工廠模式與抽象工廠模式
-
作用:實現(xiàn)創(chuàng)建者與調(diào)用者分離
-
分類:簡單工廠模式、工廠方法模式
| 模式 | 特點 | 代碼實現(xiàn) |
|---|---|---|
| 簡單工廠模式 | 用來生產(chǎn)同一等級結(jié)構(gòu)中的任意產(chǎn)品 | ![]() |
| 工廠方法模式 | 用來生產(chǎn)同一等級結(jié)構(gòu)中的固定產(chǎn)品 | ![]() |
| 抽象工廠模式 | 圍繞一個超級工廠創(chuàng)建其他工廠 | ![]() |
3.建造者模式
-
作用:在用戶不知道對象的構(gòu)造過程和細節(jié)的情況下可以直接創(chuàng)建復雜的對象
-
例子:工廠(建造者模式):負責制造汽車,組裝過程在工廠內(nèi)部;汽車購買者:通過對象的類型和內(nèi)容直接購買使用即可
-
作用:實現(xiàn)創(chuàng)建者與調(diào)用者分離
-
建造者與抽象工廠模式的比較:
* 1.與抽象工廠相比,建造者模式返回一個組裝好的完整產(chǎn)品,而抽象工廠返回一系列相關(guān)的產(chǎn)品,這些產(chǎn)品位于不同的產(chǎn)品等級結(jié)構(gòu),構(gòu)成一個產(chǎn)品族 * 2.在抽象工廠模式中,客戶端實例化工廠類,然后調(diào)用工廠方法獲取所需的產(chǎn)品對象,而建造者模式中,客戶端可以不直接調(diào)用建造者的相關(guān)方法,而是通過指揮者來指導如何生成對象,包括對象組裝過程和建造步驟,側(cè)重于一步步構(gòu)造一個復雜對象返回一個完整的對象。 * 3.如果將抽象工廠模式看成汽車配件生產(chǎn)工廠,生產(chǎn)一個產(chǎn)品族的產(chǎn)品,那么建造者模式就是汽車組裝工廠,通過對部件的組裝可以返回一輛完整的汽車。 -
代碼實現(xiàn):
//抽象的建造者
public abstract class Builder{
abstract void builder1(); //地基
abstract void builder2(); //鋼筋工程
abstract void builder3(); //鋪電線
abstract void builder4(); //粉刷
//得到產(chǎn)品
abstract Product getProduct();
}
//產(chǎn)品:房子
public class Product{
private String builder1;
private String builder1;
private String builder1;
private String builder1;
public String getBuilder1(){
return builder1;
}
public void setBuilder1(String builder){
this.builder = builder1;
}
public String getBuilder2(){
return builder2;
}
public void setBuilder2(String builder){
this.builder = builder2;
}
public String getBuilder3(){
return builder3;
}
public void setBuilder3(String builder){
this.builder = builder3;
}
public String toString(){
return "Product("+
"builder1="+builder1+'\''+
"builder2="+builder2+'\''+
"builder3="+builder3+'\''+
"builder4="+builder4+'\''+
'}';
}
}
//具體的建造者:工人
public class Worker extends Builder{
private Product product;
public Worker(){
product = new Product();
}
void builder1(){
product.setBuilder1("地基");
}
void builder1(){
product.setBuilder1("鋼筋工程");
}
void builder1(){
product.setBuilder1("鋪電線");
}
void builder1(){
product.setBuilder1("粉刷");
}
Product getProduct(){
return product;
}
}
//指揮:核心
public class Director{
public Product build(Builder builder){
builder.builder1();
builder.builder2();
builder.builder3();
builder.builder4();
return builder.getProduct();
}
}
//測試
public class Test{
public static void main(String[] args){
Director director = new Director();
Product builder = director.builder(new Worker());
System .out.println(builder.toString());
}
}
4.原型模式
-
實現(xiàn)copy《克隆》
//1.實現(xiàn)一個接口 Cloneable;2.重寫一個方法 Clone()
public class Video implements Cloneable {
private String name;
private Date creatTime;
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Video(){}
public Video(String name,Date createTime){
this.name = name;
this.createTime = createTime;
}
public getName(){
return name;
}
public setName(String name){
this.name = name;
}
public getCreateTime(){
return createTime;
}
public setCreateTime(Date createTime){
this.createTime = createTime;
}
}
public class newClone{
publlic static void main(String[] main){
//創(chuàng)建原型對象
Date date = new Date();
Video v1 = new Video("LL",date);
System.out.println("v1--"+v1);
System.out.println("v1--hash"+v1.hashCode());
//
Video v2 = (Video)v1.clone();
System.out.println("v2--"+v2);
System.out.println("v2--hash"+v2.hashCode());
}
}
創(chuàng)建型模式完結(jié)



浙公網(wǎng)安備 33010602011771號