1.落筆緣由
由于看了《Head First Design Patterns》一書,查閱資料對各種模式有所理解,把網(wǎng)上的覺得比較容易理解的資料摘抄下來,并根據(jù)《Head First Design Patterns》的內(nèi)容進行實踐和理解,在此做下筆記。
2.工廠模式概念與分類
工廠模式屬于創(chuàng)建型模式。
工廠模式可以分為三種:
1)簡單工廠模式(Simple Factory)
簡單工廠其實不是一種設(shè)計模式,反而更像一種編程習慣。
2)工廠方法模式(Factory Method)
定義了一個創(chuàng)建對象的接口,但由子類決定實例化的類是哪一個,工廠方法讓類把實例化推遲到子類。(Head First Design Patterns這樣定義的)
3)抽象工廠模式(Abstract Factory)
提供一個接口,用于創(chuàng)建相關(guān)或者依賴對象的家族,而不需要明確指定具體類。(Head First Design Patterns這樣定義的)
3.簡單工廠模式

它由三種角色組成:
工廠類角色:這是本模式的核心,含有一定的商業(yè)邏輯和判斷邏輯,根據(jù)邏輯不同,產(chǎn)生具體的工廠產(chǎn)品。
抽象產(chǎn)品角色:它一般是具體產(chǎn)品繼承的父類或者實現(xiàn)的接口。由接口或者抽象類來實現(xiàn)。
具體產(chǎn)品角色:工廠類所創(chuàng)建的對象就是此角色的實例。在java中由一個具體類實現(xiàn)。
抽象產(chǎn)品角色:
public interface Pizza {
public void prepare();
public void bake();
public void cut();
public void box();
}
具體產(chǎn)品角色:
產(chǎn)品一:起司披薩
public class CheezePizza implements Pizza {
public CheezePizza() {
System.out.println("起司Pizza");
}
public void bake() {
}
public void box() {
}
public void cut() {
}
public void prepare() {
}
}
產(chǎn)品二:蔬菜披薩
public class VaggiesPizza implements Pizza {
public VaggiesPizza() {
System.out.println("Vaggle Pizza");
}
public void bake() {
}
public void box() {
}
public void cut() {
}
public void prepare() {
}
}
工廠角色:
public class SimplePizzaFactory {
public Pizza createPizza(int type)
{
Pizza pizza = null;
if (type == 1) {
pizza = new CheezePizza();
}else if (type == 2) {
pizza = new VagglePizza();
}
return pizza;
}
}
客戶端
public class Test2 {
public static void main(String[] args) {
SimplePizzaFactory simplePizzaFactory = new SimplePizzaFactory();
Pizza pizza = simplePizzaFactory.createPizza(1);
}
}
4.工廠方法模式

它由四種角色組成:
抽象工廠角色:這是工廠方法模式的核心。是具體工廠角色必須實現(xiàn)的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現(xiàn)。
具體工廠角色:它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼。由應(yīng)用程序調(diào)用以創(chuàng)建對應(yīng)的具體產(chǎn)品的對象。在java中它由具體的類來實現(xiàn)。
抽象產(chǎn)品角色:它是具體產(chǎn)品繼承的父類或者是實現(xiàn)的接口。在java中一般有抽象類或者接口來實現(xiàn)。
具體產(chǎn)品角色:具體工廠角色所創(chuàng)建的對象就是此角色的實例。在java中由具體的類來實現(xiàn)。
抽象產(chǎn)品角色:
public abstract class Pizza {
String name;
String dough;
String sauce;
ArrayList topping = new ArrayList();
public void prepare()
{
System.out.println("Prepareing "+name);
System.out.println(dough+" Dough");
System.out.println(sauce+" Sauce");
System.out.println("Add topping:");
for (int i = 0; i < topping.size(); i++) {
System.out.println(topping.get(i)+" ");
}
}
public void bake()
{
System.out.println("Bake for 35 minutes at 350");
}
public void cut()
{
System.out.println("Cutting the pizza into diagonal slices");
}
public void box()
{
System.out.println("Place pizza in offical PizzaStore box");
}
}
具體產(chǎn)品角色:
產(chǎn)品一:紐約風味起司披薩
public class NYStyleCheesePizza extends Pizza {
public NYStyleCheesePizza() {
System.out.println("紐約起司Pizza");
}
}
產(chǎn)品二:芝加哥起司披薩
public class ChicagoStyleCheesePizza extends Pizza {
public ChicagoStyleCheesePizza() {
System.out.println("芝加哥起司Pizza");
}
}
抽象工廠角色:
public abstract class PizzaStore {
public Pizza orderPizza(int type) {
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
abstract Pizza createPizza(int type);
}
具體工廠角色一:紐約披薩工廠
public class NYPizzaStore extends PizzaStore{
public NYPizzaStore() {
System.out.println("歡迎光臨紐約Pizza店---------");
}
public Pizza createPizza(int type)
{
Pizza pizza = null;
if (type == 1) {
pizza = new NYStyleCheesePizza();
}
return pizza;
}
}
具體工廠角色二:芝加哥披薩工廠
public ChicagoPizzaStore() {
System.out.println("歡迎光臨芝加哥Pizza店---------");
}
public Pizza createPizza(int type)
{
Pizza pizza = null;
if (type == 1) {
pizza = new ChicagoStyleCheesePizza();
}
return pizza;
}
}
客戶端:
public class Test {
public static void main(String[] args) {
PizzaStore nyPizzaStore = new NYPizzaStore();
nyPizzaStore.orderPizza(1);
PizzaStore chicagoPizzaStore = new ChicagoPizzaStore();
chicagoPizzaStore.orderPizza(1);
}
}
5.抽象工廠

產(chǎn)品族:位于不同產(chǎn)品等級結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族。
工廠方法模式與抽象工廠模式的區(qū)別:
工廠方法是提供一個抽象接口來創(chuàng)建“一個產(chǎn)品”。
抽象工廠是提供一個抽象接口來創(chuàng)建一個產(chǎn)品家族。
抽象工廠由四種角色組成::
抽象工廠角色:是具體工廠角色必須實現(xiàn)的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現(xiàn)。
具體工廠角色:它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼。由應(yīng)用程序調(diào)用以創(chuàng)建對應(yīng)的具體產(chǎn)品的對象。在java中它由具體的類來實現(xiàn)。
抽象產(chǎn)品角色:它是具體產(chǎn)品繼承的父類或者是實現(xiàn)的接口。在java中一般有抽象類或者接口來實現(xiàn)。
具體產(chǎn)品角色:具體工廠角色所創(chuàng)建的對象就是此角色的實例。在java中由具體的類來實現(xiàn)。
抽象產(chǎn)品角色:
抽象產(chǎn)品角色一:抽象起司
public interface Cheese {
}
起司具體產(chǎn)品一:Mozzaralla起司
public class MozzarallaCheese implements Cheese {
public MozzarallaCheese() {
System.out.println("MozzarallaCheese");
}
}
起司具體產(chǎn)品二:Regglano起司
public class RegglanoCheese implements Cheese {
public RegglanoCheese() {
System.out.println("RegglanoCheese");
}
}
抽象產(chǎn)品角色二:抽象蔬菜
public interface Veggie {
}
蔬菜具體產(chǎn)品一:茄子
public class EggPlant implements Veggie {
public EggPlant() {
System.out.println("EggPlant");
}
}
蔬菜具體產(chǎn)品二:菠菜
public class Spinach implements Veggie {
public Spinach() {
System.out.println("Spinach");
}
}
蔬菜具體產(chǎn)品三:紅辣椒
public class RedPepper implements Veggie {
public RedPepper() {
System.out.println("RedPepper");
}
}
蔬菜具體產(chǎn)品四:黑橄欖
public class BlackOlives implements Veggie {
public BlackOlives() {
System.out.println("BlackOlives");
}
}
蔬菜具體產(chǎn)品五:大蒜
public class Garlic implements Veggie {
public Garlic() {
System.out.println("Garlic");
}
}
抽象工廠角色:
抽象工廠角色:原材料工廠
public interface IngredientFactory {
public Clam createClams();
public Sauce createSauce();
public Cheese createCheese();
public Dough createDough();
public Veggie[] createVeggies();
public Pepperoni createPepperoni();
}
具體工廠角色一:紐約原料工廠
public class NYIngredientFactory implements IngredientFactory {
public Cheese createCheese() {
return new RegglanoCheese();
}
public Clam createClams() {
return new FreshClams();
}
public Dough createDough() {
return new ThinCrustDough();
}
public Pepperoni createPepperoni() {
return new SlicedPepperoni();
}
public Sauce createSauce() {
return new ManinaraSauce();
}
public Veggie[] createVeggies() {
Veggie[] veggies= {new Garlic(),new Onion(),new Mashroom(),new RedPepper()};
return veggies;
}
}
具體工廠角色二:芝加哥原料工廠
public class ChicagoIngredientFactory implements IngredientFactory {
public Cheese createCheese() {
return new MozzarallaCheese();
}
public Clam createClams() {
return new FrozenClams();
}
public Dough createDough() {
return new ThickCrustDough();
}
public Pepperoni createPepperoni() {
return new SlicedPepperoni();
}
public Sauce createSauce() {
return new PlumTomatoSauce();
}
public Veggie[] createVeggies() {
Veggie[] veggies = {new BlackOlives(),new EggPlant(),new Garlic()};
return veggies;
}
}

6.總結(jié)
1)所以的工廠都是用來封裝對象的創(chuàng)建。
2)工廠方法使用繼承:把對象的創(chuàng)建委托給子類,子類實現(xiàn)工廠方法來創(chuàng)建對象。
public abstract class PizzaStore {
public Pizza orderPizza(int type) {
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
//子類實現(xiàn)這工廠方法來創(chuàng)建對象
abstract Pizza createPizza(int type);
}
3)抽象工廠使用對象組合,對象的創(chuàng)建被實現(xiàn)在工廠接口所暴露的方法中。
4)所以工廠模式都通過減少客戶端和具體類之間的依賴來實現(xiàn)解耦。
5)工廠方法允許類將實例化延遲到子類進行。
6)抽象工廠創(chuàng)建相關(guān)的對象家族,而不需要依賴他們的具體類。
7)依賴倒置原則,指導(dǎo)我們避免依賴具體類型,而要盡量依賴抽象。
7.源碼地址
http://download.csdn.net/detail/lgywsdy/9748030
8.參考文章
http://www.runoob.com/design-pattern/abstract-factory-pattern.html
http://www.cnblogs.com/zhangchenliang/p/3700820.html
http://download.csdn.net/detail/lgywsdy/9748113