文章目录
- 1. 工厂方法模式的定义
- 2. 工厂方法模式的类图
- 3. 工厂方法模式的作用
- 4. 工厂方法模式的实现
1. 工厂方法模式的定义
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
2. 工厂方法模式的类图
3. 工厂方法模式的作用
可以将产品的“实现”从“使用中解耦”,如果增加产品或者改变产品的实现,Factory并不会受到影响。
简单工厂和工厂方法之间的差异,在于简单工厂把全部的的事情,在一个地方都处理完了,然而工厂方法却是创建一个框架,让子类决定要如何实现。简单工厂的做法,可以将对象的创建封装起来,但是简单工厂不具备工厂方法的弹性,因为简单工厂不能变更正在创建的产品。
4. 工厂方法模式的实现
需求:需要开设不同风格的披萨店,生产不同类型的披萨。
/**
* 抽象的披萨商店
*/
public abstract class PizzaStore {
/**
* 这个就是工厂方法模式中的工厂方法,所有子类必须实现,用来创建具体产品
*
* @param type 产品类型
* @return Pizza
*/
protected abstract Pizza createPizza(String type);
/**
* 可以对产品进行操作
*
* @param type 产品类型
* @return Pizza
*/
public final Pizza create(String type) {
return createPizza(type);
};
}
/**
* 具体的披萨商店,中国风格披萨店,用来生产中国风格披萨
*/
public class ChinesePizzaStore extends PizzaStore{
@Override
protected Pizza createPizza(String type) {
if ("cheese".equals(type)) {
return new ChineseCheesePizza();
} else {
return null;
}
}
}
/**
* 具体的披萨商店,美国风格披萨店,用来生产美国风格披萨
*/
public class AmericanPizzaStore extends PizzaStore{
@Override
protected Pizza createPizza(String type) {
if ("cheese".equals(type)) {
return new AmericanCheesePizza();
} else {
return null;
}
}
}
/**
* 披萨,是个抽象的产品
*/
public interface Pizza {
}
/**
* ChineseCheesePizza,一个具体的产品
*/
public class ChineseCheesePizza implements Pizza{
public ChineseCheesePizza() {
System.out.println("我是中国风格的CheesePizza");
}
}
/**
* AmericanCheesePizza,一个具体的产品
*/
public class AmericanCheesePizza implements Pizza{
public AmericanCheesePizza() {
System.out.println("我是美国风格的CheesePizza");
}
}
/**
* 集团老板,开设多家连锁披萨店
*/
public class Boss {
public static void main(String[] args) {
// 中国风味的披萨店
ChinesePizzaStore chinesePizzaStore = new ChinesePizzaStore();
// 美国风味的披萨店
AmericanPizzaStore americanPizzaStore = new AmericanPizzaStore();
// 中国风味的CheesePizza
chinesePizzaStore.createPizza("cheese");
// 美国风味的CheesePizza
americanPizzaStore.createPizza("cheese");
}
}
我是中国风格的CheesePizza
我是美国风格的CheesePizza
Process finished with exit code 0