日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)

發布時間:2023/12/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、工廠模式(分為:簡單工廠模式、工廠方法模式、抽象工廠模式)

? ? 實現了創建者和調用者的分離

核心本質:1、實例化對象,用工廠方法代替new操作;2、將選擇實現類、創建對象統一管理和控制,從而將調用者跟實現類解耦。

簡單工廠模式:用來生產同一等級結構中的任意產品(對于增加的新的產品,需要修改已有代碼)

工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品)

抽象工廠模式:用來生產不同產品族中的全部產品(對于增加新的產品,無能為力。支持增加新的產品族)

【擴展】面向對象設計的基本原則(核心就是"分工")

OCP(開閉原則,Open-Closed Principle):一個軟件的實體應當對擴展開放,對修改關閉。

DIP(依賴倒轉原則,Dependence Inversion Principe):要針對接口編程,不要針對實現編程。

LoD(迪米特法則,Law of Demeter):只與你直接的朋友通信,避免和陌生人通信(某個類盡量與少的類反生依賴關系)。

二、各種模式詳解

1、簡單工廠模式(靜態工廠模式)

/*** 一個"汽車"類 接口 */ package cn.sxt.pattern;public interface Car {void run(); }/** "奧迪"類* */ package cn.sxt.pattern;public class Audi implements Car{public void run() {System.out.println("奧迪在跑!"); } }/*** "比亞迪"類*/ package cn.sxt.pattern;public class Byd implements Car{public void run() {System.out.println("比亞迪在跑!");} }

【沒有采用工廠模式】

/**** 沒有采用工廠模式的情況下*/ package cn.sxt.pattern;public class Test_0423_Client01 {//調用者public static void main(String[] args) {Car car=new Audi();Car car2=new Byd();car.run();car2.run(); } }

類圖:

【采用簡單工廠模式】

/**** 簡單工廠模式:用來生產同一等級結構中的任意產品(對于增加的新的產品,需要修改已有代碼)* 工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品)* 抽象工廠模式:用來生產不同產品族中的全部產品(對于增加新的產品,無能為力。支持增加新的產品族)
* 采用簡單工廠模式的一個工廠,如果要增加新的子類如“紅旗”類,只能修改已有的代碼 ("return null") 做修改,但是違反開閉原則*
*/ package cn.sxt.pattern;public class Test_0423_Factory {public static Car createCar(String type) {if ("奧迪".equals(type)) {return new Audi(); }else if ("比亞迪".equals(type)) {return new Byd(); }else {return null;} }//也可以采用這種方式去創建類對象所以也稱它為靜態方法 /* public static Car createAudi(){return new Audi();}public static Car createByd() {return new Byd(); }*/ }/**** 采用簡單工廠模式的情況下*/ package cn.sxt.pattern;public class Test_0423_Client02 {//調用者public static void main(String[] args) {Car car=Test_0423_Factory.createCar("奧迪");//不用直接與Audi類打交道,而是與工廠類打交道,通過調用方法new對象Car car2=Test_0423_Factory.createCar("比亞迪");car.run();car2.run(); } }

類圖:

2、工廠方法模式

【一個工廠方法接口和客戶類】

/**** 工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品)*/ package cn.sxt.pattern;public interface Test_0423_Factory2 {Car createCar(); }
/**** 采用工廠方法模式的情況下*/ package cn.sxt.pattern; public class Test_0423_Client03 {//調用者public static void main(String[] args) {Car car=new AudiFactory().createCar();Car car2=new BydFactory().createCar();//如果要造奔馳,那么直接增加benz.java和benzFactory.java,這樣不需要修改原有代碼,符合開閉原則。但是會增加代碼量 car.run();car2.run(); } }

【各種車型的工廠】


/**
* "奧迪"專門的工廠*/ package cn.sxt.pattern;public class AudiFactory implements Test_0423_Factory2 {public Car createCar() {return new Audi();}}/**"比亞迪"專門的工廠* */ package cn.sxt.pattern;public class BydFactory implements Test_0423_Factory2 {public Car createCar() {return new Byd();}}

類圖:

3、抽象工廠模式

? ?用來生產不同產品族的全部產品

? ?抽象工廠模式是針對產品族的情況,在多個業務品種、業務分類時,通過抽象工廠模式產生需要的對象是個很好解決辦法。

【產品族】 一個產品族:發動機、座椅、輪胎

由 高級發動機、高級座椅、高級輪胎組成一個高級產品族 ,生成一個高端汽車;

由 低級發動機、低級座椅、低級輪胎組成一個低級產品族 ,生成一個低端汽車。

【一個產品族】

/**** "發動機"接口*/ package cn.sxt.abstractFactory;public interface Engine {void run();void start(); }class LuxuryEngine implements Engine{ //"好發動機"類 public void run() {System.out.println("轉的快!"); }public void start() {System.out.println("啟動快!"); } }class LowEngine implements Engine{ //"差發動機"類 public void run() {System.out.println("轉的慢!"); }public void start() {System.out.println("啟動慢!"); } }/**** "座椅"接口*/ package cn.sxt.abstractFactory;public interface Seat {void comfortable(); }class LuxurySeat implements Seat{ //"好座椅"類 public void comfortable() {System.out.println("坐著舒服!"); } }class LowSeat implements Seat{ //"差座椅"類 public void comfortable() {System.out.println("坐著難受!"); } }/**** "輪胎"接口*/ package cn.sxt.abstractFactory;public interface Tyre {void friction(); }class LuxuryTyre implements Tyre{ //"好輪胎"類 public void friction() {System.out.println("摩擦力大!"); } }class LowTyre implements Tyre{ //"差輪胎"類 public void friction() {System.out.println("摩擦力小!"); } }

【工廠類】

/**** "造汽車的工廠"接口*/ package cn.sxt.abstractFactory;public interface Test_0423_Factory03 {Engine createEngine();Seat createSeat();Tyre createTyre(); }/*** //造"高端汽車"的工廠*/ package cn.sxt.abstractFactory;public class LuxuryCarFactory implements Test_0423_Factory03{ public Engine createEngine() {return new LuxuryEngine();//返回好發動機的對象 }public Seat createSeat() {return new LuxurySeat();}public Tyre createTyre() {return new LuxuryTyre();} }/*** //造"低端汽車"的工廠*/ package cn.sxt.abstractFactory;public class LowCarFactory implements Test_0423_Factory03{ public Engine createEngine() {//返回差發動機的對象return new LowEngine();}public Seat createSeat() {return new LowSeat();}public Tyre createTyre() {return new LowTyre();} }

【一個客戶對象】

/**** 采用抽象工廠模式的情況下*/ package cn.sxt.abstractFactory;public class Test_0423_Client04 {//調用者public static void main(String[] args) {Test_0423_Factory03 factory=new LuxuryCarFactory();Engine engine=factory.createEngine();engine.run();engine.start();Test_0423_Factory03 factory2=new LowCarFactory();Tyre tyre=factory2.createTyre();tyre.friction();} }

【類圖】

轉載于:https://www.cnblogs.com/ID-qingxin/p/10747583.html

總結

以上是生活随笔為你收集整理的[19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。