Java设计模式之工厂模式(Factory模式)介绍
什么是工厂模式?
工厂模式是一种常用的面向对象设计模式。它提供了一种创建对象的最佳方式,而无需将对象的创建细节暴露给客户端。
工厂模式通过通过一个工厂方法来创建对象。这个方法通常被声明在工厂接口或抽象类中,具体子类实现这个方法来创建具体的对象。
工厂模式可以在程序中很方便地修改对象的创建方式。
工厂模式的类型
- 简单工厂模式(Simple Factory Pattern)
简单工厂模式包含一个工厂类和多个具体产品类。工厂类的创建方法中通过多重判断语句(if/else或switch),来动态地创建所需要的产品类的实例。
示例:一个计算器工厂类,可以根据传入参数创建不同的计算器实例(加法、减法等)。
- 工厂方法模式(Factory Method Pattern)
工厂方法模式是对简单工厂模式的优化,它将工厂类抽象化,让具体实现交由其子类完成。
示例:一个披萨工厂,可以根据口味返回不同类型的披萨实例(比萨、培根比萨等)。
- 抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式用于创建一系列产品族,这些产品都有共同的主题。
示例:一个家电工厂,可以分别生产电视机、空调、洗衣机等不同的家电系列。
工厂模式的优缺点
优点
-
将产品的具体实现与创建过程分离,客户端无需关注创建过程,只需调用工厂方法即可。
-
工厂类可以根据需要决定创建哪种产品实例,客户端则无需知道具体实现过程。
-
可以轻松扩展新的产品实现,只需添加具体的产品类和对应的工厂方法即可。
缺点
-
增加了系统的抽象度和复杂度。
-
需要额外的代码实现工厂类和对应的产品类。
工厂模式的应用场景
-
当类中有大量重复的代码时,可以考虑使用工厂方法来消除重复代码。
-
当需要创建一个不知道具体类型的对象时,可以使用工厂方法来创建。
-
当希望将产品的实现与创建过程分离,使得客户端无需关注创建过程时,可以使用工厂方法。
简单工厂模式示例
// 抽象产品类
public abstract class Computer {
public abstract void display();
}
// 具体产品类
public class HPComputer extends Computer {
@Override
public void display() {
System.out.println("This is an HP computer.");
}
}
// 具体产品类
public class DellComputer extends Computer {
@Override
public void display() {
System.out.println("This is a Dell computer.");
}
}
// 简单工厂类
public class ComputerFactory {
public static Computer createComputer(String type) {
switch (type) {
case "HP":
return new HPComputer();
case "Dell":
return new DellComputer();
default:
return null;
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Computer hp = ComputerFactory.createComputer("HP");
hp.display();
Computer dell = ComputerFactory.createComputer("Dell");
dell.display();
}
}
工厂方法模式示例
// 抽象产品类
public abstract class Pizza {
public abstract void prepare();
public abstract void bake();
public abstract void cut();
public abstract void box();
}
// 具体产品类
public class CheesePizza extends Pizza {
@Override
public void prepare() {
System.out.println("Preparing cheese pizza.");
}
@Override
public void bake() {
System.out.println("Baking cheese pizza.");
}
@Override
public void cut() {
System.out.println("Cutting cheese pizza.");
}
@Override
public void box() {
System.out.println("Packing cheese pizza.");
}
}
// 具体产品类
public class PepperoniPizza extends Pizza {
@Override
public void prepare() {
System.out.println("Preparing pepperoni pizza.");
}
@Override
public void bake() {
System.out.println("Baking pepperoni pizza.");
}
@Override
public void cut() {
System.out.println("Cutting pepperoni pizza.");
}
@Override
public void box() {
System.out.println("Packing pepperoni pizza.");
}
}
// 抽象工厂类
public abstract class PizzaFactory {
public abstract Pizza createPizza(String type);
}
// 具体工厂类
public class NewYorkPizzaFactory extends PizzaFactory {
public Pizza createPizza(String type) {
switch(type) {
case "Cheese":
return new CheesePizza();
case "Pepperoni":
return new PepperoniPizza();
default:
return null;
}
}
}
// 具体工厂类
public class ChicagoPizzaFactory extends PizzaFactory {
public Pizza createPizza(String type) {
switch(type) {
case "Cheese":
return new CheesePizza();
case "Pepperoni":
return new PepperoniPizza();
default:
return null;
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
PizzaFactory nyFactory = new NewYorkPizzaFactory();
Pizza cheesePizza = nyFactory.createPizza("Cheese");
cheesePizza.prepare();
cheesePizza.bake();
cheesePizza.cut();
cheesePizza.box();
PizzaFactory chicagoFactory = new ChicagoPizzaFactory();
Pizza pepperoniPizza = chicagoFactory.createPizza("Pepperoni");
pepperoniPizza.prepare();
pepperoniPizza.bake();
pepperoniPizza.cut();
pepperoniPizza.box();
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式之工厂模式(Factory模式)介绍 - Python技术站