工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种统一的接口来创建对象,但将对象的实例化延迟到子类中。工厂模式主要解决了对象的创建过程与使用客户端代码的解耦,使得客户端代码不需要知道具体的对象创建细节,只需要通过工厂接口来获取所需的对象。
工厂模式包含三种常见的实现方式:
- 简单工厂模式(Simple Factory Pattern):由一个工厂类根据传入的参数来决定创建哪一种产品类的实例。简单工厂模式不符合开闭原则,因为新增产品时需要修改工厂类的代码。
- 工厂方法模式(Factory Method Pattern):将具体产品的创建交给子类工厂来实现,每个具体产品对应一个具体工厂。工厂方法模式符合开闭原则,新增产品时只需要添加相应的产品类和工厂类即可。
- 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建一组相关或相互依赖的产品对象,每个具体工厂类实现接口来创建一组具体产品。抽象工厂模式用于创建一族产品,而工厂方法模式用于创建单一产品。
示例:
假设我们要创建不同类型的电视机和手机产品,使用工厂模式来实现:
// 产品接口:电视机
interface TV {void display();
}// 具体产品:Sony电视机
class SonyTV implements TV {@Overridepublic void display() {System.out.println("Sony电视机");}
}// 具体产品:Samsung电视机
class SamsungTV implements TV {@Overridepublic void display() {System.out.println("Samsung电视机");}
}// 产品接口:手机
interface Phone {void call();
}// 具体产品:iPhone手机
class iPhone implements Phone {@Overridepublic void call() {System.out.println("iPhone手机");}
}// 具体产品:华为手机
class Huawei implements Phone {@Overridepublic void call() {System.out.println("华为手机");}
}// 工厂接口:电器工厂
interface ApplianceFactory {TV createTV();Phone createPhone();
}// 具体工厂:Sony电器工厂
class SonyApplianceFactory implements ApplianceFactory {@Overridepublic TV createTV() {return new SonyTV();}@Overridepublic Phone createPhone() {return new iPhone();}
}// 具体工厂:Samsung电器工厂
class SamsungApplianceFactory implements ApplianceFactory {@Overridepublic TV createTV() {return new SamsungTV();}@Overridepublic Phone createPhone() {return new Huawei();}
}// 客户端代码
public class Client {public static void main(String[] args) {// 使用Sony电器工厂创建产品ApplianceFactory sonyFactory = new SonyApplianceFactory();TV sonyTV = sonyFactory.createTV();Phone iPhone = sonyFactory.createPhone();sonyTV.display(); // 输出:Sony电视机iPhone.call(); // 输出:iPhone手机// 使用Samsung电器工厂创建产品ApplianceFactory samsungFactory = new SamsungApplianceFactory();TV samsungTV = samsungFactory.createTV();Phone huaweiPhone = samsungFactory.createPhone();samsungTV.display(); // 输出:Samsung电视机huaweiPhone.call(); // 输出:华为手机}
}