前言
前排提示:這是一個學(xué)習(xí)筆記,參照馬士兵老師和韓順平老師設(shè)計模式的視頻學(xué)習(xí)的筆記。記錄下來純?yōu)殪柟毯头奖闳蘸蟮膹?fù)習(xí)!
參考:
韓順平老師:https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=15531256878937056259
馬士兵老師:https://www.bilibili.com/video/BV1tK411W7xx?from=search&seid=15531256878937056259
設(shè)計模式(序)——設(shè)計模式初識和原則
設(shè)計模式(一)——單例模式
設(shè)計模式(二)——策略模式
設(shè)計模式(三)——簡單工廠和抽象工廠
六、工廠模式
任何可以產(chǎn)生對象的方法或者類都可以被稱之為工廠,單例模式也是一種工廠。
由實例引出工廠模式
問題1:假設(shè)現(xiàn)在有一個工廠,能生產(chǎn)寶馬、奔馳、奧迪等三個品牌汽車的零件,該如何設(shè)計?
思路:首先我們可以通過面向?qū)ο笾卸鄳B(tài)的理念來實現(xiàn)這一問題。編寫一個接口里面有一個生產(chǎn)零件的方法。編寫奔馳、寶馬和奧迪三個類來實現(xiàn)這一接口。然后在主方法中藥什么汽車的零件就new什么汽車的零件即可。
實現(xiàn)步驟:
第一步:創(chuàng)建接口
public interface ProductionParts {
void create();
}
第二步:創(chuàng)建三個類,來實現(xiàn)接口,為了簡潔這里只展出其中的一個類
public class Mercedes implements ProductionParts {
@Override
public void create() {
System.out.println("Mercedes開始制造......");
}
}
在主類中測試
public class Main {
public static void main(String[] args) {
ProductionParts parts = new Mercedes();
// ProductionParts parts = new Audi();
// ProductionParts parts = new BMW();
parts.create();
}
}
問題2:假設(shè)我們要讓第一第二號流水線生產(chǎn)奔馳的零件,第三第五號流水線生產(chǎn)寶馬的零件等,并且隔一段時間流水線生產(chǎn)的汽車品牌零件可能會變。該如何設(shè)計?
思路:這時我們可以定義一個父類,在父類中可以創(chuàng)建三個品牌,在創(chuàng)建品牌之前我們可以為其定制流水線
實現(xiàn)步驟:
第一步:創(chuàng)建父類
public class VehicleFactory {
public Mercedes createMercedes(){
//定制流水線等操作
System.out.println("三、四號流水線。。");
return new Mercedes();
}
public BMW createBMW(){
System.out.println("一、五號流水線。。");
return new BMW();
}
public Audi createAudi(){
//.....
return new Audi();
}
}
在主類中測試
public class Main {
public static void main(String[] args) {
BMW bmw = new VehicleFactory().createBMW();
bmw.create();
}
}
總結(jié)
以上兩個問題的綜合解決方案就是工廠模式。
工廠模式的優(yōu)點:
- 簡單易實現(xiàn)
- 當(dāng)我們需要什么對象時,只需要知道對象名就可以從工廠中獲取
工廠模式的缺點: - 拓展性差,每多一個品牌,就要添加一個類
七、抽象工廠
由實例引出抽象工廠
思考:由前面的簡單工廠模式引發(fā)進一步思考,假設(shè)這家工廠拓展業(yè)務(wù)了,不僅可以生產(chǎn)汽車的零件(如車門和車輪),還能生產(chǎn)公交車零件(車門和車輪)時,該如何設(shè)計
先構(gòu)建生產(chǎn)車輪的工廠和生產(chǎn)車門的工廠————抽象產(chǎn)品
public abstract class TireFactory {
abstract void createtire();
}
public abstract class DoorFactory {
abstract void createdoor();
}
編寫生產(chǎn)公交車車門和車輪的實際方法和編寫汽車車門和車輪的實際方法————具體產(chǎn)品
public class BusDoor extends DoorFactory{
@Override
public void createdoor(){
System.out.println("生產(chǎn)公交車車門");
}
}
public class BusTire extends TireFactory{
@Override
public void createtire(){
System.out.println("生產(chǎn)公交車輪胎");
}
}
public class CarDoor extends DoorFactory{
@Override
public void createdoor() {
System.out.println("生產(chǎn)汽車車門");
}
}
public class CarTire extends TireFactory {
@Override
public void createtire(){
System.out.println("生產(chǎn)汽車輪胎");
}
}
構(gòu)建一個抽象工廠可以用來生產(chǎn)車門和車輪————抽象工廠
public abstract class AbstractFactory {
abstract DoorFactory CreateDoor();
abstract TireFactory CreateTire();
}
編寫具體的公交車工廠和汽車工廠————具體工廠
public class BusFactory extends AbstractFactory {
@Override
DoorFactory CreateDoor() {
return new BusDoor();
}
@Override
TireFactory CreateTire() {
return new BusTire();
}
}
public class CarFactory extends AbstractFactory {
@Override
DoorFactory CreateDoor() {
return new CarDoor();
}
@Override
TireFactory CreateTire() {
return new CarTire();
}
}
主類測試
public class Main {
public static void main(String[] args) {
AbstractFactory busfactory = new BusFactory();
DoorFactory busdoor = busfactory.CreateDoor();
busdoor.createdoor();
TireFactory bustire = busfactory.CreateTire();
bustire.createtire();
AbstractFactory carfactory = new CarFactory();
DoorFactory cardoor = carfactory.CreateDoor();
cardoor.createdoor();
TireFactory cartire = carfactory.CreateTire();
cartire.createtire();
}
}
總結(jié)

抽象模式是對簡單工廠的進一步改造,抽象工廠基本上由四個模塊組成:抽象產(chǎn)品、抽象工廠、具體產(chǎn)品和具體工廠。
優(yōu)點:
- 擴展性比簡單工廠強
- 能夠?qū)⒁幌盗械漠a(chǎn)品統(tǒng)一創(chuàng)建
缺點:
- 規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,產(chǎn)品簇中擴展新的產(chǎn)品困難
- 增加了系統(tǒng)的抽象性和理解難度