工厂模式
在java中,万物皆为对象,这些对象都需要被创建,如果创建的时候直接new该对象,就会对该对象严重耦合,假如我们需要更换对象,所有new对象的地方都需要重新修改一遍,这就违背了开闭原则。如果使用工厂来生产对象,我们只需要和工厂打交道即可,由工厂来创建对象,就可以做到我们与对象解耦,如果需要更换对象,直接在工厂里更换对象即可。所以说,工厂模式最大的优点就是:解耦。
工厂模式的划分
一共有三种工厂模式:
- 简单工厂模式(不属于GOF的23种经典设计模式)
- 工厂方法模式
- 抽象工厂模式
1 简单工厂模式
简单工厂不是一种设计模式,反而比较像是一种编程习惯。
1.1 结构
简单工厂包含如下角色:
- 抽象产品:定义了产品的规范,描述了产品的主要特征和功能
- 具体产品:实现或者继承抽象产品的子类
- 具体工厂:提供了创建产品的方法,调用者通过该方法来创建产品
1.2 实现
//抽象产品
public abstract class Coffee {
//获取咖啡名字
public abstract String getName();
//加糖
public void addSugar(){
System.out.println("加糖");
}
//加奶
public void addMilk(){
System.out.println("加奶");
}
}
//具体产品
public class AmericanCoffee extends Coffee{
@Override
public String getName() {
return "美式咖啡";
}
}
//具体产品
public class LatteCoffee extends Coffee{
@Override
public String getName() {
return "拿铁咖啡";
}
}
//具体工厂
public class SimpleCoffeeFactory {
//创建具体咖啡的方法
public Coffee createCoffee(String type){
//声明coffee变量,根据type获取不同coffee的子类对象
Coffee coffee = null;
if("American".equals(type)){
coffee = new AmericanCoffee();
}else if("Latte".equals(type)){
coffee = new LatteCoffee();
}else {
throw new RuntimeException("对不起,本店没有您点的咖啡种类");
}
return coffee;
}
}
//测试类
public class Test {
public static void main(String[] args) {
//获取咖啡工厂
SimpleCoffeeFactory simpleCoffeeFactory = new SimpleCoffeeFactory();
//通过咖啡工厂根据type获取咖啡
Coffee coffee = simpleCoffeeFactory.createCoffee("Latte");
coffee.addMilk();
System.out.println(coffee.getName());
}
}
测试结果:
加奶
拿铁咖啡
1.3 优缺点
优点: 封装了创建对象的过程,可以通过不同的参数直接获取不同的对象,把对象的创建和业务逻辑层分开,这样就避免了以后修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。
缺点: 增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”。
1.4 扩展
静态工厂
在开发中也有一部分人将工厂类中的创建对象的功能定义为静态的,这个就是静态工厂模式,它同样不属于23种设计模式。
//具体工厂
public class SimpleCoffeeFactory {