简单工厂模式
简单工厂模式又叫做静态工厂方法模式属于创建型模式。简单工厂模式专门定义一个类来负责创建其他类的实例,由这个类来封装实例化对象的行为,被创建的实例通常都具有共同的父类。简单工厂模式并不是23种设计模式之一,反而比较向一种编程习惯。 简单工厂包括:
- 抽象产品:定义了产品的规范,描述了产品的主要特性和功能
- 具体产品:实现或者继承抽象产品的子类
- 具体工厂:提供了创建产品的方法,调用者通过方法来创建产品
【案例】
假设有家咖啡店 它目前只卖美式咖啡和拿铁咖啡,但是随着业务的发展,它又加入了卡布奇诺和摩卡咖啡, 小张、小王、小李想喝不同的咖啡,请设计程序完成咖啡店的点餐功能
抽象产品
public abstract class Coffee{
abstract String getName();
void addSugar(){ System.out.println("加糖"); }
void addMilk(){ System.out.println("加奶"); }
}
具体产品
美式咖啡
public class AmericanCoffee extends Coffee {
String getName(){
return "美式咖啡";
}
}
拿铁咖啡
public class LatteCoffee extends Coffee {
String getName(){
return "拿铁咖啡";
}
}
卡布奇诺
public class Cappuccino extends Coffee{
String getName(){
return "卡布奇诺";
}
}
摩卡咖啡
public class MochaCoffee extends Coffee{
String getName(){return "摩卡咖啡";}
}
工厂类
public class SimpleFactory{ //抽象工厂:提供了创建产品的接口
public static Coffee createCoffee(String name){
Coffee coffee = null;
if ("American".equals(name)){
coffee = new AmericanCoffee();
}else if("Latte".equals(name)){
coffee = new LatteCoffee();
}else if ("Cappuccino".equals(name)){
coffee = new Cappuccino();
}else if ("Mocha".equals(name)){
coffee = new MochaCoffee();
}
coffee.addSugar();
coffee.addMilk();
return coffee;
}
}
点餐
public class CoffeeStore {
public static void main(String[] args) {
Coffee coffee = SimpleFactory.createCoffee("American");//小张想喝美式咖啡
System.out.println(coffee.getName()+"制作中...");
Coffee coffee1 = SimpleFactory.createCoffee("Latte");//小王想喝拿铁咖啡
System.out.println(coffee1.getName()+"制作中...");
Coffee coffee2 = SimpleFactory.createCoffee("Cappuccino");//小李想喝卡布奇诺
System.out.println(coffee2.getName()+"制作中...");
}
}
简单工厂模式的优缺点
- 优点:
实现对象创建和使用的分离 创建对象完全交给工厂类负责
客户端无需知道所创建具体产品的类名,只需知道参数即可 - 缺点:
工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统将受影响
不够灵活 如果每新增个产品就要修改工厂类 违背了OCP开闭原则
- 简单工厂模式的适用环境
工厂类负责创建对的对象比较少,因为不会造成工厂方法中的业务逻辑过于复杂
客户端只知道传入工厂类的参数,对如何创建对象不关心