JAVA專案實戰-設計模式-工廠模式的專案使用
阿新 • • 發佈:2020-09-02
今天學習的是創造型設計模式之一 '工廠模式',我們經常講的可分為三類
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()); } }
總結:抽象工廠解決工廠方法的單一產品線,支援生產產品一組。