設計模式學習java
1.簡單工廠設計模式
簡單工廠定義一個類來專職負責建立其餘類的實例,從而使程序能夠在運行時決定具體建立哪一個類的實例。ide
角色:抽象產品、具體產品、簡單工廠角色。學習
①DecoderFactory.java測試
package simplefactory; public class DecoderFactory { public static Decoder createDecoder(String fileName){ // 讀取文件的擴展名 String fileNameExt = fileName.substring(fileName.lastIndexOf('.'),fileName.length()); if(fileNameExt.equals(".mp3")){ return new Mp3Decoder(); }else if(fileNameExt.equals(".wma")){ return new WmaDecoder(); } else return null; } }
②Decoder.javaspa
package simplefactory; // 抽象的解碼器類,對應簡單工廠模式的抽象產品角色 public abstract class Decoder { public abstract void decode(String fileName); }
③Mp3Decoder.java設計
package simplefactory; public class Mp3Decoder extends Decoder { @Override public void decode(String fileName) { // 對mp3格式進行解碼並回放 System.out.println("Decode and PlayBack the music "+ fileName + "……"); } }
④WmaDecoder.javacode
package simplefactory; public class WmaDecoder extends Decoder { @Override public void decode(String fileName) { // 對wma格式進行解碼並回放 System.out.println("Decode and PlayBack the music "+ fileName + "……"); } }
⑤SimplePlay.java 測試對象
package simplefactory; public class SimplePlay { public static void main(String[] args) { // 測試引用 //String fileName = "Santorini.mp3"; String fileName = "Santorini.wma"; Decoder decoder = DecoderFactory.createDecoder(fileName); decoder.decode(fileName); } }
2.工廠方法模式blog
工廠方法是簡單工廠模式的進一步抽象和推廣,核心的工廠類被提高爲了一個抽象類,它再也不負責全部產品的建立,而是將具體的建立交給它的某個子類實現。
角色:抽象產品類(Product)、具體產品類(ConcreteProduct)、抽象工廠類(Factory)、具體工廠類(ConcreteFactory)
①Factory.java
package factorymethod; // 抽象工廠類,對應工廠方法模式中的抽象工程角色(Factory) public abstract class Factory { public abstract Decoder createDecoder(); }
②Mp3DecoderFactory.java
package factorymethod; // Mp3 解碼器工廠,只生產Mp3 解碼器對象,對應於工廠方法模式中的具體工廠角色。 public class Mp3DecoderFactory extends Factory { @Override public Decoder createDecoder() { // TODO Auto-generated method stub return new Mp3Decoder(); } }
③WmaDecoderFactory.java
package factorymethod; //wma 解碼器工廠,只生產wma 解碼器對象,對應於工廠方法模式中的具體工廠角色。 public class WmaDecoderFactory extends Factory { @Override public Decoder createDecoder() { // TODO Auto-generated method stub return new WmaDecoder(); } }
④Decoder.java
package factorymethod; // 抽象的解碼器類,對應簡單工廠模式的抽象產品角色 public abstract class Decoder { public abstract void decode(String fileName); }
⑤Mp3Decoder.java
package factorymethod; public class Mp3Decoder extends Decoder { @Override public void decode(String fileName) { // 對mp3格式進行解碼並回放 System.out.println("Decode and PlayBack the music "+ fileName + "……"); } }
⑥WmaDecoder.java
package factorymethod; public class WmaDecoder extends Decoder { @Override public void decode(String fileName) { // 對wma格式進行解碼並回放 System.out.println("Decode and PlayBack the music "+ fileName + "……"); } }
⑦SimplePlayer.java 測試
package factorymethod; // 測試抽象工程使用 public class SimplePlayer { public static void main(String[] args) { //String fileName = "Santorini.mp3"; String fileName = "Santorini.wma"; //建立一個特定類型的解碼器工廠對象 //選擇了工廠即選擇了產品 Factory factory = new Mp3DecoderFactory(); //調用該工廠對象的createDecoder()方法生成一個具體的解碼器產品對象 Decoder decoder = factory.createDecoder(); //使用解碼器產品對象 decoder.decode(fileName); } }
3.抽象工廠模式
抽象工廠模式提供一個建立一系列相關或相互依賴的對象的接口,而無需指定它們的具體的類。
角色:抽象產品類(Product)、具體產品類(ConcreteProduct)、抽象工廠類(Factory)、具體工廠類(ConcreteFactory)
①Audio.java
package abstractfactorymethod; // 抽象音頻類,對應抽象工程模式中的AbstractProduct角色 public abstract class Audio { public abstract void playBack(); } class MandarinAudio extends Audio{ @Override public void playBack() { // TODO Auto-generated method stub System.out.println("播放國語"); } } class CantoneseAudio extends Audio{ @Override public void playBack() { // TODO Auto-generated method stub System.out.println("播放粵語"); } }
②Subtitle.java
package abstractfactorymethod; //抽象字幕類,對應抽象工廠模式中的AbstractProduct角色 public abstract class Subtitle { public abstract void show(); } class CantoneseSubtitle extends Subtitle{ @Override public void show() { // TODO Auto-generated method stub System.out.println("顯示粵語!"); } } class MandarinSubtitle extends Subtitle{ @Override public void show() { // TODO Auto-generated method stub System.out.println("顯示國語!"); } }
③AbstractFactory.java
package abstractfactorymethod; // 抽象工廠類,對應抽象工廠模式中的AbstractFactory角色 public abstract class AbstractFactory { public abstract Audio creatAudio(); public abstract Subtitle createSubtitle(); }
④CantoneseFactory.java
package abstractfactorymethod; public class CantoneseFactory extends AbstractFactory { @Override public Audio creatAudio() { // TODO Auto-generated method stub return new CantoneseAudio(); } @Override public Subtitle createSubtitle() { // TODO Auto-generated method stub return new CantoneseSubtitle(); } }
⑤MandarinFactory.java
package abstractfactorymethod; //國語版本工廠類,對應抽象工廠模式中的ConcreteFactory角色 public class MandarinFactory extends AbstractFactory { @Override public Audio creatAudio() { return new MandarinAudio(); } @Override public Subtitle createSubtitle() { return new MandarinSubtitle(); } }
⑥Simpleplayer.java 測試
package abstractfactorymethod; // 測試抽象工程使用 public class SimplePlayer { public static void main(String[] args) { //建立一個能生成國語音頻和字幕的工廠 // AbstractFactory aFactory = new MandarinFactory(); //建立一個能生成粵語音頻和字幕的工廠 AbstractFactory aFactory = new CantoneseFactory(); //生產音頻類產品,實際生產出什麼產品由工廠類對象所限定 Audio audio = aFactory.creatAudio(); //生產字幕類產品,實際生產什麼產品有工廠類對象所限定 Subtitle subtitle = aFactory.createSubtitle(); audio.playBack(); subtitle.show(); } }