工厂模式和抽象工厂模式
工厂模式
场景:需要创建单一类型对象,且支持灵活扩展不同子类产品。
代码
// 抽象产品接口(定义产品规范)[1,3](@ref)
interface Animal {
void speak();
}
// 具体产品实现类
class Dog implements Animal {
@Override
public void speak() {
System.out.println("Dog: Woof!");
}
}
class Cat implements Animal {
@Override
public void speak() {
System.out.println("Cat: Meow!");
}
}
// 抽象工厂接口(定义创建方法)[2,7](@ref)
interface AnimalFactory {
Animal createAnimal();
}
// 具体工厂类(每个工厂对应一个产品)
class DogFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog(); // 创建Dog对象
}
}
class CatFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Cat(); // 创建Cat对象
}
}
// 客户端调用示例
public class Client {
public static void main(String[] args) {
AnimalFactory dogFactory = new DogFactory();
Animal dog = dogFactory.createAnimal(); // 获取Dog实例
dog.speak(); // 输出:Dog: Woof!
AnimalFactory catFactory = new CatFactory();
Animal cat = catFactory.createAnimal(); // 获取Cat实例
cat.speak(); // 输出:Cat: Meow!
}
}
理解:
- 抽象产品接口用来定义产品规范,比如定义一些默认方法,然后有多个具体的产品实现类。创建抽象工厂接口,其中定义了创建方法,每个产品定义一个工厂类(实现工厂接口),扩展新接口时只需要新增工厂。
- 客户端与具体产品解耦,仅依赖抽象接口。
抽象工厂模式
场景:需要创建一组相关或依赖的对象(如跨平台UI组件、数据库连接+命令组合)
代码
// 抽象产品族接口(定义多个关联产品)[5,10](@ref)
interface Button {
void render();
}
interface TextBox {
void input();
}
// 具体产品实现(Windows风格)
class WinButton implements Button {
@Override
public void render() {
System.out.println("Windows风格按钮");
}
}
class WinTextBox implements TextBox {
@Override
public void input() {
System.out.println("Windows风格文本框输入");
}
}
// 具体产品实现(Mac风格)
class MacButton implements Button {
@Override
public void render() {
System.out.println("Mac风格按钮");
}
}
class MacTextBox implements TextBox {
@Override
public void input() {
System.out.println("Mac风格文本框输入");
}
}
// 抽象工厂接口(定义创建多个产品的方法)[5,9](@ref)
// 多个组件或方法依赖的情况
interface GUIFactory {
Button createButton();
TextBox createTextBox();
}
// 具体工厂类(每个工厂对应一个产品族)
class WinFactory implements GUIFactory {
@Override
public Button createButton() {
return new WinButton(); // 创建Windows按钮
}
@Override
public TextBox createTextBox() {
return new WinTextBox(); // 创建Windows文本框
}
}
class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton(); // 创建Mac按钮
}
@Override
public TextBox createTextBox() {
return new MacTextBox(); // 创建Mac文本框
}
}
// 客户端调用示例
public class Client {
public static void main(String[] args) {
// 切换工厂即可切换整套UI风格
GUIFactory factory = new MacFactory(); // 或 new WinFactory()
Button button = factory.createButton();
button.render(); // 输出风格对应的按钮
TextBox textBox = factory.createTextBox();
textBox.input(); // 输出风格对应的文本框
}
}
理解:
- 一个工厂类创建一组关联、依赖对象,包含多个抽象产品接口和具体工厂,每个工厂负责多个产品的组合,适合多产品协同合作

浙公网安备 33010602011771号