请用java代码实现工厂方法模式并详细介绍
工厂方法模式是一种常用的设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化延迟到子类中进行。
下面是一个简单的工厂方法模式的示例,假设我们有一个披萨店,我们需要生产不同类型的披萨。我们可以定义一个Pizza接口,然后让不同类型的披萨实现这个接口。然后我们可以定义一个披萨工厂,让它根据客户所需的披萨类型来生产对应的披萨。
首先,我们定义Pizza接口:
public interface Pizza {
void prepare();
void bake();
void cut();
void box();
}
然后,我们定义不同类型的披萨:
public class CheesePizza implements 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("Boxing cheese pizza");
}
}
public class PepperoniPizza implements 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("Boxing pepperoni pizza");
}
}
接下来,我们定义一个Pizza工厂,让它根据客户所需的披萨类型来创建对应的披萨:
public class PizzaFactory {
public Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new CheesePizza();
} else if (type.equals("pepperoni")) {
return new PepperoniPizza();
} else {
return null;
}
}
}
最后,我们可以在客户端代码中使用Pizza工厂来创建披萨:
public class Client {
public static void main(String[] args) {
PizzaFactory factory = new PizzaFactory();
Pizza cheesePizza = factory.createPizza("cheese");
cheesePizza.prepare();
cheesePizza.bake();
cheesePizza.cut();
cheesePizza.box();
Pizza pepperoniPizza = factory.createPizza("pepperoni");
pepperoniPizza.prepare();
pepperoniPizza.bake();
pepperoniPizza.cut();
pepperoniPizza.box();
}
}
运行以上代码,我们可以输出以下结果:
Preparing cheese pizza
Baking cheese pizza
Cutting cheese pizza
Boxing cheese pizza
Preparing pepperoni pizza
Baking pepperoni pizza
Cutting pepperoni pizza
Boxing pepperoni pizza
工厂方法模式的核心就是将对象的创建和使用分离开来,通过工厂来创建对象,这样我们就可以在不影响客户端代码的情况下,更改对象的创建方式。这种模式可以提高代码的模块化程度,增加代码的扩展性和可维护性。
原文地址: http://www.cveoy.top/t/topic/bmJN 著作权归作者所有。请勿转载和采集!