1.定義
屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
2.簡單工廠模式結構
簡單工廠模式包含如下角色:
-
Factory:工廠角色
工廠角色負責實現創建所有實例的內部邏輯。例子中的SimpleAnimalFactory
/**
* 簡單工廠
*/
public class SimpleAnimalFactory {
/**
* 第一種方法
* @param animalTypeEnum
* @return
*/
public static Animal createAnimal(AnimalTypeEnum animalTypeEnum) {
Animal animal = null;
switch (animalTypeEnum) {
case Cat: animal = new Cat();
break;
case Dog: animal = new Dog();
break;
case Bird: animal = new Bird();
break;
}
return animal;
}
/**
* 第二種方法(jdk8)
*/
private static Map<AnimalTypeEnum, Supplier<Animal>> map = new HashMap<>();
static {
map.put(AnimalTypeEnum.Bird,Bird::new);
map.put(AnimalTypeEnum.Cat,Cat::new);
map.put(AnimalTypeEnum.Dog,Dog::new);
}
public static Animal createAnimal2(AnimalTypeEnum animalTypeEnum) {
return map.get(animalTypeEnum).get();
}
public static void main(String[] args) {
Animal animal = SimpleAnimalFactory.createAnimal(AnimalTypeEnum.Dog);
animal.say();
Animal animal2 = SimpleAnimalFactory.createAnimal2(AnimalTypeEnum.Cat);
animal2.say();
}
}
public enum AnimalTypeEnum {
Bird("bird"),
Cat("cat"),
Dog("dog");
private String type;
AnimalTypeEnum(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
-
Product:抽象產品角色
抽象產品角色是所創建的所有對象的父類,負責描述所有實例所共有的公共接口。例子中的Animal
public abstract class Animal {
abstract public void say();
}
-
ConcreteProduct:具體產品角色
具體產品角色是創建目標,所有創建的對象都充當這個角色的某個具體類的實例。例子中的bird、dog、cat
public class Bird extends Animal {
@Override
public void say() {
System.out.println("咕咕咕");
}
}
public class Cat extends Animal {
@Override
public void say() {
System.out.println("喵喵喵");
}
}
public class Dog extends Animal {
@Override
public void say() {
System.out.println("汪汪汪");
}
}
3.簡單工廠模式分析
將對象的創建和對象本身業務處理分離可以降低系統的耦合度,使得兩者修改起來都相對容易。
簡單工廠模式最大的問題在於工廠類的職責相對過重,增加新的產品需要修改工廠類的判斷邏輯,這一點與開閉原則是相違背的。
簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。