河北省住房城鄉(xiāng)建設(shè)廳網(wǎng)站防城港網(wǎng)站seo
目錄
1. 簡單工廠模式
2. 工廠方法模式
1. 簡單工廠模式
簡單工廠模式(Simple Factory Patterm)又稱為靜態(tài)工廠方法模式(Static Factory Model),它屬于類創(chuàng)建型模式。在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實例。簡單工廠模式專門定義了一個類來負(fù)責(zé)創(chuàng)建其他類的實例,被創(chuàng)建的實例通常都有共同的父類。
實現(xiàn):
首先定義一個抽象類 Product 和繼承 Product 的實體類(ProductA/productB)。實體類要實現(xiàn)抽象類Product 里的抽象方法 method(),在各自的 method() 方法里實現(xiàn)自己的功能。下一步定義工廠類?Factory。
工廠類里有一個 createProduct() 方法,根據(jù)傳入的參數(shù)來判斷返回的對象類型。
?步驟1:創(chuàng)建抽象類 Product
abstract public class Product{public abstract void print();
}
步驟2:創(chuàng)建繼承 Product 的實體類
public class ProductA extends Product{@overridepublic void print(){System.out.println("產(chǎn)品A");.....}
}
public class ProductB extends Product{@overridepublic void print(){System.out.println("產(chǎn)品B");......}
}
步驟3:創(chuàng)建一個工廠,返回特定的產(chǎn)品對象
public class ProductFactory{// 創(chuàng)建具體產(chǎn)品實例public static Product createProduct(String type){if(type == null){return null;}if(type.equals("A"){return new ProductA();} else{return new ProductB();}}
}
?步驟4:使用該工廠,通過傳遞類型信息來獲取實體類的對象
public class SimpleFactoryPattermDemo{public static void main(String[] args){// createProduct("A") 里傳入?yún)?shù)A, 獲取到 ProductA 對象Product productA = ProductFactory.createProduct("A");productA.print();// createProduct("B") 里傳入?yún)?shù)A, 獲取到 ProductB 對象Product productB = ProductFactory.createProduct("B"):productB.print();}
}
優(yōu)點:對象的創(chuàng)建和使用是分離的??蛻舳藷o需知道創(chuàng)建對象的細(xì)節(jié),也無需直接創(chuàng)建產(chǎn)品對象。
缺點:?系統(tǒng)擴(kuò)展困難,違背了開閉原則。當(dāng)我們新增一個 ProductC時,在步驟3中就會修改 createProduct 的邏輯,新增一個 if 語句來滿足 ProductC 對象的創(chuàng)建和返回。這一點就違背了開閉原則的修改關(guān)閉。
2. 工廠方法模式
由于簡單工廠模式不符合開閉原則,因此引入了工廠方法模式,也稱為工廠模式,它完全符合開閉原則。
?工廠方法模式是 Java 中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于類創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。在工廠模式中,我們在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象。
實現(xiàn):
?步驟1:創(chuàng)建一個Coffee 接口
public interface Coffee{void createCoffee();
}
步驟2:創(chuàng)建實現(xiàn) Coffee 接口的實體類
public class AmericanCoffee implements Coffee{@overridepublic void createCoffee(){System.out.println("create AmericanCoffee");....}
}
public class LatteCoffee implements Coffee{@overridepublic void createCoffee(){System.out.println("create LatteCoffee");....}
}
步驟3:創(chuàng)建一個 Factory 接口
public interface CoffeeFactory{Coffee createCoffeeInstance();
}
步驟4:創(chuàng)建實現(xiàn) CoffeeFactory 接口的實體類,分別對應(yīng)步驟2中 的 Coffee 實體類
public class AmericanCoffeeFactory implements CoffeeFactory{@overridepublic Coffee createCoffeeInstance(){System.out.println("return a AmericanCoffee`s instance");return new AmericanCoffee();}
}
public class LatteCoffeeFactory implements CoffeeFactory{@overridepublic Coffee createCoffeeInstance(){System.out.println("return a LatteCoffee`s instance");return new LatteCoffee();}
}
?步驟5:使用 CoffeeFactory 來獲取 Coffee 實例
public class FactoryPatternDemo{public static void main(Stirng[] args){// TODO 寫法1// 通過配置文件的方式來判斷具體是哪一種 Coffee, 然后使用對應(yīng)的CoffeeFactoryCoffeeFactory coffeeFactory = new CoffeeFactory();Coffee coffee = coffeeFactory.createCoffeeInstance();coffee.createCoffee();}
}
當(dāng)我們需要新增加一個 BlackCoffee 時,只需要新建類?BlackCoffee implements Coffee 和 BlackCoffeeFactory implements CoffeeFactory 就 ok了,滿足了開閉原則中的擴(kuò)展開發(fā),修改關(guān)閉。
優(yōu)點:
用戶只需要知道具體工廠的名稱就可得到所要的產(chǎn)品,無須知道產(chǎn)品的具體創(chuàng)建過程; 在系統(tǒng)增加新的產(chǎn)品時只需要添加具體產(chǎn)品類和對應(yīng)的具體工廠類,無須對原工廠進(jìn)行任何修改,滿足開閉原則
注意:復(fù)雜對象適合使用工廠模式,而簡單對象,特別是只需要通過 new 就可以完成創(chuàng)建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統(tǒng)的復(fù)雜度。