1. 程式人生 > 實用技巧 >JAVA專案實戰-設計模式-工廠模式的專案使用

JAVA專案實戰-設計模式-工廠模式的專案使用

今天學習的是創造型設計模式之一 '工廠模式',我們經常講的可分為三類

1.簡單工廠

2.工廠方法

3.抽象工廠

如果現在有一個需求,上傳圖片到客戶配置的伺服器地址。可能存在多種型別伺服器如(騰訊雲,阿里雲,百度雲)

一.簡單工廠

/**
 * @description: Api服務service
 * @author: ZhuCJ 
 * @date: 2020-09-01 13:07
*/ public interface ApiService { /** * 上傳圖片 * @return */ Boolean uploadImg(); }
/**
 * @description: 百度服務API
 * 
@author: ZhuCJ 80004071 * @date: 2020-09-01 13:08 */ public class BaiduServiceImpl implements ApiService{ @Override public Boolean uploadImg() { System.out.println("百度API服務---->執行上傳圖片至百度雲"); return true; } } /** * @description: 騰訊服務API * @author: ZhuCJ 80004071 * @date: 2020-09-01 13:08
*/ public class TencentApiServiceImpl implements ApiService{ @Override public Boolean uploadImg() { System.out.println("騰訊API服務---->執行上傳圖片到騰訊雲伺服器"); return true; } } /** * @description: 簡單工廠模型 * @author: ZhuCJ 80004071 * @date: 2020-09-01 13:03 */ public class SimplenessFactory {
public static ApiService build(int i){ ApiService service = null; switch (i){ case 1: service = new TencentApiServiceImpl(); break; case 2: service = new BaiduServiceImpl(); break; default: break; } return service; } }
/**
 * @description: 測試
 * @author: ZhuCJ  80004071
 * @date: 2020-09-01 13:14
 */
public class SimplenessMain {


    public static void main(String[] args) {
        int type = 1;
        /** 初學者建立物件方法*/
        if (type  == 1){
            TencentApiServiceImpl tencentApiService = new TencentApiServiceImpl();
            tencentApiService.uploadImg();
        }else if (type == 2){
            BaiduServiceImpl baiduService = new BaiduServiceImpl();
            baiduService.uploadImg();
        }
        /** 利用簡單工廠建立物件 */
        ApiService build = SimplenessFactory.build(type);
        build.uploadImg();
    }
   
}

總結:

new物件方式:

1.程式碼不美觀,還需要根據邏輯來判斷

2.不利於擴充套件和維護(如程式碼邏輯發生變動,需要刪除程式碼重新new一個新的物件

簡單工廠:

優點:1.解耦 新增新的物件,只需要找工廠類中新增即可,即也不需要關注業務邏輯;2.幫助封裝,使面向介面程式設計;

缺點:1.不方便子工廠的擴充套件

二.工廠方法

/**
 * @description: 水果抽象工廠
 * @author: ZhuCJ  
 * @date: 2020-09-01 17:05
 */
public abstract class FruitsAbstractFactory {

    /**
     * 建立水果
     * @return
     */
    public Fruits createFruits(){
        return null;
    }
}

/**
 * @description:
 * @author: ZhuCJ  
 * @date: 2020-08-19 15:38
 */
public class BananaFactory extends FruitsAbstractFactory {

    @Override
    public Fruits createFruits(){
        return new Banana("香蕉","黃色");
    }

}

/**
 * @description:
 * @author: ZhuCJ  
 * @date: 2020-09-01 17:08
 */
public class AppleFactory extends FruitsAbstractFactory {

    @Override
    public Fruits createFruits(){
        return new Apple("蘋果","紅色");
    }
}

/**
 * @description:
 * @author: ZhuCJ  
 * @date: 2020-08-19 15:38
 */
public class Apple extends Fruits {

    public Apple(String name,String cooler) {
        super.name = name;
        super.cooler = cooler;
    }

}

/**
 * @description:
 * @author: ZhuCJ  
 * @date: 2020-08-19 15:38
 */
public class Banana extends Fruits {

    public Banana(String name,String cooler){
        super.name = name;
        super.cooler = cooler;
    }

}

/**
 * @description: 水果
 * @author: ZhuCJ  
 */
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Fruits {
     String name;

     String cooler;


    public void desc(){
        System.out.println("我是:"+name+" 顏色是:"+cooler);
    }
}
/**
 * @description:
 * @author: ZhuCJ  
 * @date: 2020-09-01 17:22
 */
public class MethodFactoryMain {


    public static void main(String[] args) {
        FruitsAbstractFactory appleFruitsFactory = new AppleFactory();
        appleFruitsFactory.createFruits().desc();
        FruitsAbstractFactory bananaFruitsFactory = new BananaFactory();
        bananaFruitsFactory.createFruits().desc();
    }
}

總結:

工廠方法優勢:

1.滿足JAVA的開閉原則,即如果需要新增加產品,只需要簡單繼承即可

2.每一種工廠只負責生產一種產品,保證單獨處理業務邏輯,減少了簡單工廠中switch判斷

缺點:

1.只能建立單一的產品

2.每新增加產品,都需要繼承父類 增加系統複雜性

三.抽象工廠模式

/**
 * @description: 抽象工廠模式
 * @author: ZhuCJ  
 * @date: 2020-08-19 14:30
 */
public abstract class AbstractFactory {

    /**
     * ****利用抽象工廠建立產品一組***********
     */

    /**
     * 建立水果產品線
     * @return
     */
   public AbstractFruits buildFruits(){
       return null;
   }

    /**
     * 建立交通工具產品線
     * @return
     */
   public AbstractMedia buildMedia(){
       return null;
   }

    /**
     * 建立電影
     * @return
     */
   public AbstractMovie buildMovie(){
       return null;
   }
}
/**
 * @description: 工廠一
 * @author: ZhuCJ  
 * @date: 2020-08-19 14:30
 */
public class AbstractFactoryImplOne extends AbstractFactory {

    /**
     * =========工廠一 建立一個香蕉 和火車 和 老人與海的 工廠
     */

    /**
     * 建立香蕉產品
     * @return
     */
    @Override
    public AbstractFruits buildFruits(){
        return new Banana("小香蕉");
    }

    /**
     * 建立交通工具產品線
     * @return
     */
    @Override
    public AbstractMedia buildMedia(){
        return new Train("T95號列車");
    }


    /**
     * 建立交通工具產品線
     * @return
     */
    @Override
    public AbstractMovie buildMovie(){
        return new OldMenAndSea(new Date(),"一部英勇的電影");
    }
}

/**
 * @description: 水果抽象類
 * @author: ZhuCJ  
 * @date: 2020-08-19 16:14
 */
@Data
public abstract class AbstractFruits {

    String name;

    public AbstractFruits(String name) {
        this.name = name;
    }

    public AbstractFruits() {
    }
}


/**
 * @description:
 * @author: ZhuCJ  
 * @date: 2020-08-19 15:38
 */
public class Banana extends AbstractFruits implements Fruits {

    public Banana(String name){
       super(name);
    }

    @Override
    public String getName() {
        return super.name;
    }

    @Override
    public void function() {

    }

    public void colour() {
        System.out.println(super.name+"顏色一般是黃色的");
    }
}

/**
 * @description: 交通工具抽象類
 * @author: ZhuCJ  
 * @date: 2020-08-19 16:14
 */
@Data
public abstract class AbstractMedia {

    protected String name;

    public AbstractMedia(String name) {
        this.name = name;
    }

}

/**
 * @description:
 * @author: ZhuCJ  
 * @date: 2020-08-19 15:38
 */
public class Train extends AbstractMedia {

    public Train(String name) {
        super(name);
    }

    public String getName() {
        return super.name;
    }

    public void Function() {
        System.out.println(name+"承載著客人,穿行在鐵軌上.....");
    }

}

/**
 * @description: 電影抽象類
 * @author: ZhuCJ  
 * @date: 2020-08-19 16:14
 */
@Data
public abstract class AbstractMovie {

    protected Date releaseDate;

    public AbstractMovie(Date releaseDate) {
        this.releaseDate = releaseDate;
    }
}

/**
 * @description: 老人與海
 * @author: ZhuCJ  
 * @date: 2020-08-21 13:21
 */
public class OldMenAndSea extends AbstractMovie implements Movie {

    public OldMenAndSea(Date releaseDate) {
        super(releaseDate);
    }

    private String desc;

    public OldMenAndSea(Date releaseDate, String desc) {
        super(releaseDate);
        this.desc = desc;
    }

    public String introduce(){
        return  "老人與海"+ "上映時間:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(super.releaseDate)+" "+this.desc;
    }
}
/**
 * @description: 抽象工廠 生產產品族
 * @author: ZhuCJ  80004071
 * @date: 2020-09-01 17:55
 */
public class AbstractFactoryMain {


    public static void main(String[] args) {
        AbstractFactory factoryOne = new AbstractFactoryImplOne();
        AbstractFruits abstractFruits = factoryOne.buildFruits();
        System.out.println("建立水果---->"+abstractFruits.getName());
        AbstractMedia abstractMedia = factoryOne.buildMedia();
        System.out.println("建立交通工具---->"+abstractMedia.getName());
        AbstractMovie abstractMovie = factoryOne.buildMovie();
        System.out.println("建立的電影,上映時間----->"+abstractMovie.getReleaseDate());

    }
}

總結:抽象工廠解決工廠方法的單一產品線,支援生產產品一組。