工廠:顧名思義,生產,加工產品的地方
工廠模式:就是在軟件中提供專門用來創建對象實例的類(相當於一個加工生產對象的工廠),對所有的new操作進行封裝,當要實例化對象的時候,根據傳入的參數決定要實例化哪一個對象。
工廠模式包括工廠方法模式和抽象工廠模式。
抽象工廠模式是工廠方法模式的擴展。
工廠方法模式:
我們要創建一個生產不同口味冰淇淋的工廠,首先所有口味的冰淇淋類都會有一個生成冰淇淋的方法,而這個方法就可以抽象爲一個接口(IceCreamInterface),讓不同口味的冰淇淋類實現該接口,最後還需要一個工廠類,根據傳入的參數實例化不同口味的冰淇淋對象。
1. 製作冰淇淋的方法接口
//冰淇淋接口
public interface IceCreamInterface {
//製作冰淇淋的方法
public void createIceCream();
}
2. 實現接口的不同口味的冰淇淋類//製作菠蘿冰淇淋
public class PineappleCream implements IceCreamInterface {
@Override
public void createIceCream() {
System.out.println("生成一個菠蘿冰淇淋");
}
}
//製作草莓冰淇淋
public class StrawberryCream implements IceCreamInterface {
@Override
public void createIceCream() {
System.out.println("生成一個草莓冰淇淋");
}
}
3. 冰淇淋工廠類,根據傳入的字符串實例化冰淇淋對象
//生成冰淇淋的工廠
public class IceCreamFactory {
//根據傳入的name來判斷需要創建哪個對象
public IceCreamInterface getIceCream(String name){
if("strawberry".equals(name)){
return new StrawberryCream();
}else if("pineapple".equals(name)){
return new PineappleCream();
}else{
return null;
}
}
}
4. 調用工廠類實例化對象IceCreamFactory factory1=new IceCreamFactory();
//向上轉型
IceCreamInterface iceCream1=factory1.getIceCream("strawberry");
if(iceCream1!=null){
iceCream1.createIceCream();
}
iceCream1=factory1.getIceCream("pineapple");
if(iceCream1!=null){
iceCream1.createIceCream();
}
抽象工廠模式
我們要生產兩種類別的冰淇淋,分別是蛋卷冰淇淋和紙杯冰淇淋,同時蛋卷冰淇淋還分手工和機器生產的兩種,紙杯同樣也分手工和機器的兩種,於是我們要生產四種產品類型的冰淇淋(四個生成不同對象的類)。要建立兩個工廠,一個是手工工廠用於生產手工冰淇淋(實例化手工產品的對象),一個是機器工廠用於生產機器冰淇淋(實例化機器產品的對象)。
1. 抽象生產紙杯冰淇淋方法爲CupCream接口
//紙杯冰淇淋接口
public interface CupCream {
public void createCupCream();
}
2. 實現接口的手工紙杯冰淇淋類和機器紙杯冰淇淋類
//手工紙杯冰淇淋
public class ManualCupCream implements CupCream{
@Override
public void createCupCream() {
System.out.println("生成一個手工紙杯冰淇淋");
}
}
//機器紙杯冰淇淋
public class MachineCupCream implements CupCream{
@Override
public void createCupCream() {
System.out.println("生成一個機器紙杯冰淇淋");
}
}
3. 抽象生產蛋卷冰淇淋方法爲EggCream接口//蛋卷冰淇淋接口
public interface EggCream {
public void createEggCream();
}
4. 實現接口的手工蛋卷冰淇淋類和機器蛋卷冰淇淋類//手工蛋卷冰淇淋
public class ManualEggCream implements EggCream {
@Override
public void createEggCream() {
System.out.println("生成一個手工蛋卷冰淇淋");
}
}
//機器蛋卷冰淇淋
public class MachineEggCream implements EggCream {
@Override
public void createEggCream() {
// TODO Auto-generated method stub
System.out.println("生成一個機器蛋卷冰淇淋");
}
}
5. 定義包裝工廠接口,包括得到蛋卷冰淇淋和紙杯冰淇淋的抽象方法
//包裝工廠接口
public interface WrappingFactroy {
public EggCream getEggCream();
public CupCream getCupCream();
}
6. 實現包裝工廠接口的手工工廠和機器工廠
//手工生產工廠
public class ManualFactory implements WrappingFactroy{
@Override
public EggCream getEggCream() {
return new ManualEggCream();
}
@Override
public CupCream getCupCream() {
return new ManualCupCream();
}
}
//機器生產工廠
public class MachineFactory implements WrappingFactroy{
@Override
public EggCream getEggCream() {
return new MachineEggCream();
}
@Override
public CupCream getCupCream() {
return new MachineCupCream();
}
}
7. 調用工廠類實例化對象
WrappingFactroy wrapping=new ManualFactory() ;
EggCream eggCream=wrapping.getEggCream();
eggCream.createEggCream();
CupCream cupCream=wrapping.getCupCream();
cupCream.createCupCream();
wrapping=new MachineFactory();
eggCream=wrapping.getEggCream();
eggCream.createEggCream();
cupCream=wrapping.getCupCream();
cupCream.createCupCream();