工厂方法模式:
- 定义:定义一个用于创建对象的接口,让子类去决定实例化哪一个类,工厂方法是使一个类实例化过程延迟到其子类中。在这种模式下,工厂类不在是实体类,而是一个接口或者抽象类,具体实现则是要到其子类中。这样就可以规避掉简单工厂模式中新增对象是需要修改工厂类的缺点。
- 工厂方法模式包括以下四个角色:
- 抽象的工厂角色: 这个角色是工厂方法模式的核心。创建对象的工厂类必须实现改接口。一般含有返回产品的方法。
- 具体工厂角色: 这个类是实现了抽象工厂角色,里面包含具体的逻辑。
- 抽象产品角色: 产品对象需要继承或者实现的接口或者抽象类。
- 具体产品角色: 实现或者继承抽象产品角色。
- 工厂方法模式的类图:
- 工厂方法模式的示例代码
场景:某餐厅有中文菜单和英文菜单,而且对于中国人和其他人的同一种的菜的口味或者做法也不相同。
产品抽象角色:
public interface Food {
//准备
void prepare();
//烹饪
void cook();
//上菜
void serve();
//点菜
void order();
}
具体产品角色:
中国版麻婆豆腐:
public class MapoTofuForChinese implements Food {
@Override
public void prepare() {
System.out.println("麻婆豆腐>>>>>准备中ing");
}
@Override
public void cook() {
System.out.println("麻婆豆腐>>>>>烹饪中ing");
}
@Override
public void serve() {
System.out.println("麻婆豆腐 >>>>>上菜ing");
}
@Override
public void order() {
prepare();
cook();
serve();
}
}
中国版土豆丝:
public class PotatoSilkForChinese implements Food {
@Override
public void prepare() {
System.out.println("土豆丝>>>>>准备中ing");
}
@Override
public void cook() {
System.out.println("土豆丝>>>>>烹饪中ing");
}
@Override
public void serve() {
System.out.println("土豆丝>>>>>上菜ing");
}
@Override
public void order() {
prepare();
cook();
serve();
}
}
其他版麻婆豆腐:
public class MapoTofuForOther implements Food{
@Override
public void prepare() {
System.out.println("MapoTofuForOther>>>>>准备中ing");
}
@Override
public void cook() {
System.out.println("MapoTofuForOther>>>>>烹饪中ing");
}
@Override
public void serve() {
System.out.println("MapoTofuForOther >>>>>上菜ing");
}
@Override
public void order() {
prepare();
cook();
serve();
}
}
其他版土豆丝:
public class PotatoSilkForOther implements Food {
@Override
public void prepare() {
System.out.println("PotatoSilkForOther>>>>>准备中ing");
}
@Override
public void cook() {
System.out.println("PotatoSilkForOther>>>>>烹饪中ing");
}
@Override
public void serve() {
System.out.println("PotatoSilkForOther>>>>>上菜ing");
}
@Override
public void order() {
prepare();
cook();
serve();
}
}
抽象的工厂角色:
public interface Meun {
Food createFood(String type);
}
具体工厂角色:
中式菜单:
public class ChineseMenu implements Meun {
@Override
public Food createFood(String type) {
if (type.equals("MapoTofu")){
return new MapoTofuForChinese();
}else if (type.equals("PotatoSilk")){
return new PotatoSilkForChinese();
}else {
return null;
}
}
}
其他菜单:
public class EnglishMenu implements Meun {
@Override
public Food createFood(String type) {
if (type.equals("MapoTofu")){
return new MapoTofuForOther();
}else if (type.equals("PotatoSilk")){
return new PotatoSilkForOther();
}else {
return null;
}
}
}
测试主函数:
public class Main {
public static void main(String[] args) {
Meun meun = null;
Food food = null;
meun = new ChineseMenu();
food = meun.createFood("MapoTofu");
food.order();
meun = new EnglishMenu();
food = meun.createFood("PotatoSilk");
food.order();
}
}
以上的示例代码确实能实现工厂方法模式,但是还是没有解决如果新增内容后还需要修改具体的工厂类的问题。