設計模式學習之——簡單工廠、工廠方法、抽象工廠方法

設計模式學習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();
    }

}
相關文章
相關標籤/搜索