什么是工厂模式
工厂模式是用来创建对象的一种设计模式,不向外暴露创建对象的具体逻辑,而是将逻辑封装在一个方法中,那么这个方法就被视为工厂。
工厂模式可以具体分为三种
- 简单工厂模式(不属于23种设计模式,是一种编程习惯,也叫静态工厂模式)
- 工厂方法模式
- 抽象工厂模式
简单工厂模式
简单工厂模式包含三个角色:
- 抽象产品:规定了对象的规范
- 具体产品:实现了抽象产品的子类
- 具体工厂:静态方法,用来创建对象的工厂
//创建一个抽象类,抽象出子类的公共方法
public interface Coffee {
void getName();
}
//静态工厂,用来调用静态方法创建对象。
public class SimpleCoffeeFactory {
public static Coffee createCoffee(String type) {
Coffee coffee = null;
if ("americano".equals(type)) {
coffee = new AmericanoCoffee();
} else if ("latte".equals(type)) {
coffee = new LatteCoffee();
}
return coffee;
}
}
class AmericanoCoffee implements Coffee {
@Override
public void getName() {
System.out.println("AmericanoCoffee");
}
}
class LatteCoffee implements Coffee {
@Override
public void getName() {
System.out.println("LatteCoffee");
}
}
静态工厂模式的缺点:如果不断的增加新的产品,就要在不断的修改具体工厂的代码,违法了开闭原则。
工厂方法模式
工厂方法模式解决了简单工厂模式的缺点,核心结构有四个角色。
- 抽象工厂:提供了创建产品的接口
- 具体工厂:实现了抽象工厂接口,完成具体对象的创建过程。
- 抽象产品:定义了产品的规范
- 具体产品:实现了抽象产品的子类
//抽象产品
public interface Coffee {
void getName();
}
//具体的产品
class AmericanoCoffee implements Coffee {
@Override
public void getName() {
System.out.println("AmericanoCoffee");
}
}
class LatteCoffee implements Coffee {
@Override
public void getName() {
System.out.println("LatteCoffee");
}
}
//抽象工厂
public interface CoffeeFactory {
Coffee createCoffee();
}
//具体工厂
class AmericanCoffeeFactory implements CoffeeFactory {
@Override
public Coffee createCoffee() {
return new AmericanoCoffee();
}
}
class LatteCoffeeFactory implements CoffeeFactory {
@Override
public Coffee createCoffee() {
return new LatteCoffee();
}
}
工厂方法模式解决了静态工厂模式的缺点,增加新的产品时只需要增加新的具体工厂类,不需要修改原来的代码。同时也带来了新的缺点,每增加一个新的产品类,就要增加一个对应的具体工厂类,提升了代码的复杂度。
抽象工厂模式
抽象工厂模式是工厂模式中最为抽象和最具有一般性的形态,解决了工厂方法模式的缺点
主要角色
- 抽象工厂
- 具体工厂
- 抽象产品
- 具体产品
//抽象产品
public interface Coffee {
void getName();
}
//具体产品
class AmericanoCoffee implements Coffee {
@Override
public void getName() {
System.out.println("AmericanoCoffee");
}
}
class LatteCoffee implements Coffee {
@Override
public void getName() {
System.out.println("LatteCoffee");
}
}
//抽象工厂
public interface DessertFactory {
Coffee createCoffee();
Dessert createDessert();
}
//具体工厂
public class AmericanDessertFactory implements DessertFactory {
public Coffee createCoffee() {
return new AmericanCoffee();
}
public Dessert createDessert() {
return new MatchaMousse();
}
}
public class ItalyDessertFactory implements DessertFactory {
public Coffee createCoffee() {
return new LatteCoffee();
}
public Dessert createDessert() {
return new Tiramisu();
}
}
如果要加同一个产品族的话,只需要再加一个对应的工厂类即可,不需要修改其他的类。但是当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。