寫的項目進入了維護階段,閒下來就發現自己的基礎知識薄弱到爆,最近打算好好研究一下Java基礎,首先選擇的就是Java的設計模式,總覺得自己對於這個部分的應用不是很熟練平時寫代碼的時候想的也不夠深入,現在正好有時間就要靜下心來自己好好研究一下。
對於Java的設計模式,我相信用Java語言的都不陌生,但真正用到的時候可能用的就不那麼精了,我做Android開發,所以一般常常聽到的就是適配器模式、工廠模式、單例模式、觀察者模式。但是Java還有很多我沒有涉及過的各種模式。
一、Java的設計模式總體來說設計模式分爲三大類:
創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
其實還有兩類:併發型模式和線程池模式
二、設計模式的原則
可參考http://www.uml.org.cn/sjms/201211023.asp
http://blog.csdn.NET/cq361106306/article/details/38708967
先來看看創建型模式中的工廠方法模式:
工廠方法模式屬於工廠模式的一種,工廠模式包括簡單工廠模式、工廠方法模式、抽象工廠模式,而簡單工廠模式(Simple Factory)看爲工廠方法模式的一種特例,兩者歸爲一類所以 GOF在《設計模式》一書中將工廠模式分爲兩類:工廠方法模式(Factory Method)與抽象工廠模式(Abstract Factory)。
1、簡單認識一下工廠方法模式:
工廠方法模式其用意是定義一個創建產品對象的工廠機考,將實際創建工作推遲到子類中。
工廠方法模式的實質是“定義一個創建對象的藉口,但讓實現這個接口的類來決定實例化那個類”
工廠方法模式是簡單工廠模式的進一步抽象化和推廣,工廠方法模式裏不再只由一個工廠類決定那一個產品類應當被實例化,這個決定被交給抽象工廠的子類去做。
工廠方法模式的角色結構:
1)抽象工廠角色: 這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。(創建對象需要實現的接口,包含創建對象的抽象方法)
public abstract class basefactory { abstract humam creatHuman();}
2)具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體產品的對象(通過調用它實現的抽象方法來來獲取具體的實體類bean,具體工廠角色不唯一,可以有多個具體工長生產具體產品,一個類型的具體工廠生產一類具體產品)
public class creathuman extends basefactory { @Override
human creatHuman() {
System.out.print("creatHuman successful");
return new student();
}
}
弊端:可以看出工廠方法的加入,使得對象的數量成倍增長。當產品種類非常多時,會出現大量的與之對應的工廠對象,這不是我們所希望的 。 可以考慮使用簡單工廠模式與工廠方法模式相結合的方式來減少工廠類(具體工廠角色)
3)抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中一般由抽象類或者接口來實現。(我理解的實體類bean都要實現的接口)
//抽象產品角色
public interface human {
void speak();
}
4)具體產品角色:具體工廠角色所創建的對象就是此角色的實例。在java中由具體的類來實現。(實現抽象產品角色接口的類,實體類bean具體屬性方法,具體產品角色不唯一)
- public class student implements human {
- @Override
- public void speak() {
- System.out.print("student can speak");
- }
- }
-
//測試
public class test {
public static void main(String[] args) {
creathuman factory = new creathuman();
human human = factory.creatHuman();
human.speak();
}
}//輸出結果:student can speak
1) 工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯,用來創建產品(用Java的一個具體類來實現)
2) 抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。
3) 具體產品角色:工廠類所創建的對象就是此角色的實例。在Java中由一個具體類實現。
***************************************************************************************
抽象工廠模式:
參考http://baike.sogou.com/v4738637.htm?fromTitle=%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F,http://laughingchs.iteye.com/blog/1169986<br>
它的角色和工廠方法的角色一致
代碼:
//抽象工廠類
public abstract class AbstractFactory {
public abstract Vehicle createVehicle();
public abstract Weapon createWeapon();
public abstract Food createFood();
}
//具體工廠類,其中Food,Vehicle,Weapon是抽象類,
public class DefaultFactory extends AbstractFactory{
@Override
public Food createFood() {
return new Apple();
}
@Override
public Vehicle createVehicle() {
return new Car();
}
@Override
public Weapon createWeapon() {
return new AK47();
}
}
//測試類
public class Test {
public static void main(String[] args) {
AbstractFactory f = new DefaultFactory();
Vehicle v = f.createVehicle();
v.run();
Weapon w = f.createWeapon();
w.shoot();
Food a = f.createFood();
a.printName();
}
}
在只有一個產品族的情況下,抽象工廠模式實際上退化到工廠方法模式
比較:
工廠方法模式:一個抽象產品類,可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類只能創建一個具體產品類的實例。
抽象工廠模式:多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類可以創建多個具體產品類的實例。
感謝前輩們的分享!!!