工厂模式全解析:简单、方法、抽象工厂详解
一.简单工厂模式
1.定义
简单工厂模式是由一个工厂对象确定创建哪一种产品类的实例。适用于工厂类需要创建对象较少的场景,且客户端只需要传入工厂类的参数,对如何创建对象的逻辑不需要关心。不符合开闭原则
2.适用场景
- 工厂类负责创建的对象较少
- 客户端只需要传入工厂类的参数,对如何创建对象的逻辑不需要关心
3.缺点
工厂类的职责相对过重,不易于扩展过于复杂的产品结构
4.代码示例
// 产品接口
interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}// 具体产品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}// 简单工厂类
class SimpleFactory {// 使用反射public Product createProduct(Class<? extends Product> clazz) {try {clazz.newInstance();}catch (Exception e) {e.printStackTrace();}return null;}
}// 客户端代码
public class Client {public static void main(String[] args) {SimpleFactory factory = new SimpleFactory();Product product = factory.createProduct(ConcreteProductA.class);product.use();}
}
二.工厂方法模式
1.定义
工厂方法模式是指定义一个创建对象的接口,让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。符合开闭原则
2.适用场景
- 创建对象需要大量重复的代码
- 客户端不依赖于产品类实例如何被创建,实现等细节
- 一个类通过其子类来指定创建哪个对象
3.缺点
- 类的个数过多,增加复杂度
- 增加了系统的抽象性和理解难度
4.代码示例
// 抽象产品
interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}// 具体产品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}// 抽象工厂
abstract class Creator {public abstract Product createProduct();
}// 具体工厂A
class ConcreteCreatorA extends Creator {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具体工厂B
class ConcreteCreatorB extends Creator {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}// 客户端代码
public class Client {public static void main(String[] args) {Creator creatorA = new ConcreteCreatorA();Product productA = creatorA.createProduct();productA.use();Creator creatorB = new ConcreteCreatorB();Product productB = creatorB.createProduct();productB.use();}
}
三.抽象工厂模式
1.定义
抽象工厂模式是一种创建型设计模式,用于创建一系列相关或相互依赖的对象,而无需指定其具体类。它通过抽象接口定义一组工厂方法,每个方法负责生成一种产品,从而实现产品族的创建与具体产品类的解耦。不符合开闭原则
- 产品族:指一组相关联的产品(如 “小米手机 + 小米耳机”、“苹果手机 + 苹果耳机”)。
- 抽象工厂:定义创建产品族中各类产品的接口(如 “生产手机”、“生产耳机”)。
- 具体工厂:实现抽象工厂接口,负责生产某一产品族的具体产品(如 “小米工厂” 生产小米手机和小米耳机)。
- 抽象产品:定义产品的接口(如 “手机”、“耳机”)。
- 具体产品:实现抽象产品接口的具体类(如 “小米手机”、“苹果耳机”)。
2.适用场景
系统需要处理多个产品族,且每次只使用其中一个产品族
产品族中的产品存在强关联性,必须组合使用
客户端无需关心产品的具体创建过程,只需依赖抽象接口
3.缺点
1.规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
2.增加了系统的抽象性和理解难度
4.代码示例
定义抽象产品接口
public interface Button {void render();
}public interface Checkbox {void render();
}
定义具体产品类
public class WindowsButton implements Button {@Overridepublic void render() {System.out.println("Render Windows button");}
}public class MacOSButton implements Button {@Overridepublic void render() {System.out.println("Render MacOS button");}
}public class WindowsCheckbox implements Checkbox {@Overridepublic void render() {System.out.println("Render Windows checkbox");}
}public class MacOSCheckbox implements Checkbox {@Overridepublic void render() {System.out.println("Render MacOS checkbox");}
}
定义抽象工厂接口
public interface GUIFactory {Button createButton();Checkbox createCheckbox();
}
定义具体工厂类
public class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic Checkbox createCheckbox() {return new WindowsCheckbox();}
}public class MacOSFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacOSButton();}@Overridepublic Checkbox createCheckbox() {return new MacOSCheckbox();}
}
客户端代码
public class Application {private Button button;private Checkbox checkbox;public Application(GUIFactory factory) {// 客户端仅通过抽象接口调用方法,不涉及具体产品或工厂的细节button = factory.createButton();checkbox = factory.createCheckbox();}public void render() {button.render();checkbox.render();}
}