概述
在設(shè)計(jì)原則中有這樣的一句話“我們應(yīng)該針對接口編程,而不是針對實(shí)現(xiàn)編程”,但是,在大部分的情況下,我們都是以new關(guān)鍵字來創(chuàng)建對象的,針對接口編程的原因在于多態(tài)的使用,我們希望能夠調(diào)用一個(gè)簡單的方法,傳遞一個(gè)參數(shù)就可以返回一個(gè)相應(yīng)的對象,這個(gè)時(shí)候我們不在是采用new來創(chuàng)建對象,這個(gè)就是普通工廠模式,也叫簡單工廠模式。
舉個(gè)例子說吧,現(xiàn)實(shí)中車子的種類很多,大巴車,轎車,救護(hù)車,越野車等等,每一個(gè)種類下面還有很多的型號,一個(gè)工廠生產(chǎn)這么多的車很難管理,就會有很多分廠,例如生產(chǎn)轎車的分廠,生產(chǎn)貨車的分廠,但是,客戶不需要知道工廠是怎么區(qū)分的,客戶只會告訴客服,他需要什么車,客服會根據(jù)客戶的需求去找到對應(yīng)的車長去生產(chǎn)車,對客戶來說,工廠只是一個(gè)抽象的概念,他只知道有這么一個(gè)工廠能滿足他的需要。
上述例子的類圖

image
偽代碼
public class ProductFactory{
public static IProduct createProduct(String productNo){
switch (productNo) {
case "1":
return new Product1(XXXX);
case "2":
return new Product2(XXXX);
case "3":
return new Product3(XXXX);
case "4":
return new Product4(XXXX);
case "5":
return new Product5(XXXX);
default: throw new
NotSupportedException("不支持此編號的車");
break;
}
}
}
定義
普通工廠模式又稱為靜態(tài)工廠方法,屬于創(chuàng)建型模式,在普通工廠模式中,可以根據(jù)傳遞的參數(shù)不同,返回不同類的實(shí)例,普通工廠模式定義了一個(gè)類,這個(gè)類專門用于創(chuàng)建其他類的實(shí)例,這些被創(chuàng)建的類都有一個(gè)共同的父類。
普通工廠模式的實(shí)現(xiàn)
情景:在一個(gè)披薩店中,要根據(jù)不同客戶的口味,生產(chǎn)不同的披薩,類圖如下:

image
代碼實(shí)現(xiàn)
SimplyPizzaFactory工廠類
/**
*生產(chǎn)披薩的工廠類
* @author lky
*/
public class SimplyPizzaFactory {
public Pizza createPizza(String type){
Pizza pizza = null;
if(type.equals("cheese")){
pizza = new CheesePizza();
}
else if(type.equals("clam")){
pizza = new ClamPizza();
}
else if(type.equals("pepperoni")){
pizza = new PepperoniPizza();
}
else if(type.equals("veggie")){
pizza = new VeggiePizze();
}
return pizza;
}
}
抽象披薩類
public abstract class Pizza {
public abstract void prepare();
public abstract void bak();
public abstract void cut();
public abstract void box();
}
具體披薩CheesePizza
public class CheesePizza extends Pizza{
@Override
public void prepare() {
System.out.println("CheesePizza披薩正在準(zhǔn)備");
}
@Override
public void bak() {
System.out.println("CheesePizza披薩正在烘烤");
}
@Override
public void cut() {
System.out.println("CheesePizza披薩正在切片");
}
@Override
public void box() {
System.out.println("CheesePizza披薩正在裝盒");
}
}
具體披薩ClamPizza
public class ClamPizza extends Pizza{
@Override
public void prepare() {
System.out.println("ClamPizza披薩正在準(zhǔn)備");
}
@Override
public void bak() {
System.out.println("ClamPizza披薩正在烘烤");
}
@Override
public void cut() {
System.out.println("ClamPizza披薩正在切片");
}
@Override
public void box() {
System.out.println("ClamPizza披薩正在裝盒");
}
}
具體披薩PepperoniPizza
public class PepperoniPizza extends Pizza{
@Override
public void prepare() {
System.out.println("PepperoniPizza披薩正在準(zhǔn)備");
}
@Override
public void bak() {
System.out.println("PepperoniPizza披薩正在烘烤");
}
@Override
public void cut() {
System.out.println("PepperoniPizza披薩正在切片");
}
@Override
public void box() {
System.out.println("PepperoniPizza披薩正在裝盒");
}
}
具體披薩VeggiePizze
public class VeggiePizze extends Pizza{
@Override
public void prepare() {
System.out.println("VeggiePizze披薩正在準(zhǔn)備");
}
@Override
public void bak() {
System.out.println("VeggiePizze披薩正在烘烤");
}
@Override
public void cut() {
System.out.println("VeggiePizze披薩正在切片");
}
@Override
public void box() {
System.out.println("VeggiePizze披薩正在裝盒");
}
}
披薩商店類
public class PizzaStore {
SimplyPizzaFactory factory;
public PizzaStore(SimplyPizzaFactory factory) {
this.factory = factory;
}
public Pizza orderPizza(String type){
Pizza pizza;
pizza = factory.createPizza(type);//采用工廠對象的創(chuàng)建方法實(shí)例化
pizza.prepare();
pizza.bak();
pizza.cut();
pizza.box();
return pizza;
}
}
總結(jié)
- 普通工廠模式實(shí)現(xiàn)了對責(zé)任的分割,提供了專門的工廠用于創(chuàng)建對象。
- 客戶端不需要知道所創(chuàng)建的具體產(chǎn)品的類名,只要知道產(chǎn)品類對應(yīng)的編號即可。
- 要點(diǎn)就是當(dāng)你需要什么,只需要傳入一個(gè)正確的參數(shù)就可以,不需要關(guān)心它具體的實(shí)現(xiàn)細(xì)節(jié)。
- 如果產(chǎn)品過多就會導(dǎo)致工廠類的代碼十分的復(fù)雜。