系列傳送門
創(chuàng)建型模式
這一類模式用于創(chuàng)建對(duì)象等龙。
隱藏或抽象創(chuàng)建對(duì)象的細(xì)節(jié)处渣,而不是使用 new直接創(chuàng)建對(duì)象。
設(shè)計(jì)模式一蛛砰、創(chuàng)建型模式-單例模式
設(shè)計(jì)模式二罐栈、創(chuàng)建型模式-簡單工廠模式
設(shè)計(jì)模式三、創(chuàng)建型模式-工廠模式
設(shè)計(jì)模式四暴备、創(chuàng)建型模式-抽象工廠模式
設(shè)計(jì)模式五悠瞬、創(chuàng)建型模式-建造者模式
工廠模式
核心是讓子類去實(shí)現(xiàn)對(duì)象的創(chuàng)建過程。
在一個(gè)抽象類F中涯捻,定義創(chuàng)建對(duì)象A的抽象方法浅妆,該抽象方法由抽象類F的不同的子類去實(shí)現(xiàn)。
如果對(duì)象A中的一些操作不確定障癌,只有在創(chuàng)建時(shí)才能確定凌外,那么可以把這些操作定義為抽象操作,把對(duì)象A轉(zhuǎn)換為抽象對(duì)象A涛浙。
抽象對(duì)象A的抽象操作由抽象類F的子類康辑,在創(chuàng)建抽象對(duì)象A的子類時(shí)去實(shí)現(xiàn)。
定義汽車對(duì)象
/**
* 汽車對(duì)象
*/
class Car {
// 汽車品牌
private String brand;
// 汽車各種零部件屬性...
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
/**
* 定義了汽車的組裝操作(工廠模式)
* 這里不確定如何組裝轿亮,則交給生產(chǎn)該汽車的廠商來決定如何組裝
*/
abstract void compose();
/**
* 定義了汽車的檢測操作(工廠模式)
* 這里不確定如何檢測疮薇,則交給生產(chǎn)該汽車的廠商來決定如何檢測
*
* @return boolean 是否合格
*/
abstract boolean check();
/**
* 定義了汽車的銷毀操作(工廠模式)
* 這里不確定如何銷毀,則交給生產(chǎn)該汽車的廠商來決定如何銷毀
*/
abstract void destroy();
}
定義汽車工廠抽象類
/**
* 汽車工廠
* 這里只提供對(duì)生產(chǎn)的汽車的入庫我注、組裝按咒、檢測和銷毀操作。
* 也只定義了汽車的生產(chǎn)操作(抽象方法)但骨,具體操作由不同的汽車生產(chǎn)商自己實(shí)現(xiàn)励七。
*/
public abstract class CarFactory {
// 車庫
private List<Car> cars = new ArrayList<>();
/**
* 汽車入庫
*
* @param car 生產(chǎn)的汽車
*/
public void save(Car car) {
cars.add(car);
}
/**
* 組裝汽車
*
* @param car 要組裝的汽車
*/
public void compose(Car car) {
car.compose();
}
/**
* 檢測汽車質(zhì)量
*
* @param car 要檢測的汽車
* @return boolean 是否合格
*/
public boolean check(Car car) {
return car.check();
}
/**
* 銷毀不合格汽車
*
* @param car 生產(chǎn)的不合格的汽車
*/
public void destroy(Car car) {
car.destroy();
cars.remove(car);
}
/**
* 定義了汽車的生產(chǎn)操作(工廠模式)
*
* @return car 生產(chǎn)的汽車
*/
protected abstract Car createCar();
}
定義具體的汽車生產(chǎn)工廠(奔馳)
public class BenzFactory extends CarFactory {
/**
* 奔馳工廠實(shí)現(xiàn)自己的生產(chǎn)操作
*
* @return Car 生產(chǎn)的汽車
*/
@Override
protected Car createCar() {
Car car = new Car(){
@Override
void compose() {
// TODO 實(shí)現(xiàn)該汽車的組裝操作
}
@Override
boolean check() {
// TODO 實(shí)現(xiàn)該汽車的檢測操作
return getBrand().equals("Benz");
}
@Override
void destroy() {
// TODO 實(shí)現(xiàn)該汽車的銷毀操作
}
};
car.setBrand("Benz");
// 組裝汽車
compose(car);
return car;
}
}
定義具體的汽車生產(chǎn)工廠(大眾)
public class VWFactory extends CarFactory {
/**
* 大眾工廠實(shí)現(xiàn)自己的生產(chǎn)操作
*
* @return Car 生產(chǎn)的汽車
*/
@Override
protected Car createCar() {
Car car = new Car(){
@Override
void compose() {
// TODO 實(shí)現(xiàn)該汽車的組裝操作
}
@Override
boolean check() {
// TODO 實(shí)現(xiàn)該汽車的檢測操作
return getBrand().equals("VW");
}
@Override
void destroy() {
// TODO 實(shí)現(xiàn)該汽車的銷毀操作
}
};
car.setBrand("VW");
// 組裝汽車
compose(car);
return car;
}
}
測試
public class Main {
/**
* 工廠模式:
* 在一個(gè)抽象類F中智袭,定義創(chuàng)建對(duì)象A的抽象方法,該抽象方法由抽象類F的不同的子類去實(shí)現(xiàn)掠抬。
* 如果對(duì)象A中的一些操作不確定吼野,只有在創(chuàng)建時(shí)才能確定,那么可以把這些操作定義為抽象操作两波,把對(duì)象A轉(zhuǎn)換為抽象對(duì)象A瞳步。
* 抽象對(duì)象A的抽象操作由抽象類F的子類,在創(chuàng)建抽象對(duì)象A的子類時(shí)去實(shí)現(xiàn)雨女。
* <p>
* 這里的例子是把汽車的生產(chǎn)和檢測操作交給具體的汽車生產(chǎn)商去實(shí)現(xiàn)
*/
public static void main(String[] args) {
// 生產(chǎn)一輛奔馳汽車
CarFactory benzFactory = new BenzFactory();
Car benzCar = benzFactory.createCar();
// 檢測汽車是否合格
if (benzFactory.check(benzCar)) {
// 汽車合格谚攒,入庫
benzFactory.save(benzCar);
} else {
// 汽車不合格,銷毀
benzFactory.destroy(benzCar);
}
// 生產(chǎn)一輛大眾汽車
CarFactory vwFactory = new VWFactory();
Car vwCar = vwFactory.createCar();
// 檢測汽車是否合格
if (benzFactory.check(vwCar)) {
// 汽車合格氛堕,入庫
benzFactory.save(vwCar);
} else {
// 汽車不合格馏臭,銷毀
benzFactory.destroy(vwCar);
}
}
}