在简单工厂模式下,现在增加一种新的烹饪方式--油炸鱼,首先创建FryFish的实例,并实现Fish的接口,还需要修改工厂类CookFishFactory的方法,代码如下:
FryFish.java:
public class FryFish extends Fish {
@Override
public void cook() {
Log.d(MainActivity.TAG, "油炸鱼");
}
}
CookFishFactory.java
public static Fish createFish(String type) {
Fish fish = null;
if (type.equals("steam")) {
fish = new SteamFish();
} else if (type.equals("stew")) {
fish = new StewFish();
} else if (type.equals("fry")) {
fish = new FryFish();
}
return fish;
}
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cookFish("steam");
cookFish("fry");
}
private void cookFish(String type) {
Fish fish = CookFishFactory.createFish(type);
if (fish != null) {
fish.cook();
}
}
当新增加烹饪方式时,就的去修改工厂类的方法,这里违背了“开放-封闭”原则,为了解决该问题,工厂方法由此诞生。
首先,需要定义一个CookFishFactory的接口,内部包括getFish的方法, 代码如下:
public interface CookFishFactory {
Fish getFish();
}
现在我们需要一些具体的子类,接下来去实现蒸鱼、炖鱼和炸鱼的相关操作。
实现蒸鱼工厂,并实现CookFishFactory接口,代码如下:
CookSteamFishFactory.java
public class CookSteamFishFactory implements CookFishFactory {
@Override
public Fish getFish() {
return new SteamFish();
}
}
客户端代码实现如下:
MainActivity.java
private void cook() {
CookFishFactory cookSteamFish = new CookSteamFishFactory();
Fish steamFish = cookSteamFish.getFish();
steamFish.cook();
}
运行结果如下:
蒸鱼
客户端继续实现炖鱼和油炸鱼的相关方法,创建炖鱼工厂CookStewFishFactory和油炸鱼工厂CookFryFishFactory,分别实现CookFishFactory接口,代码如下:
CookStewFishFactory.java
public class CookStewFishFactory implements CookFishFactory {
@Override
public Fish getFish() {
return new StewFish();
}
}
CookFryFishFactory.java
public class CookFryFishFactory implements CookFishFactory {
@Override
public Fish getFish() {
return new FryFish();
}
}
MainActivity.java
private void cook() {
//蒸鱼
CookFishFactory cookSteamFish = new CookSteamFishFactory();
Fish steamFish = cookSteamFish.getFish();
steamFish.cook();
//炖鱼
CookFishFactory cookStewFish = new CookStewFishFactory();
Fish stewFish = cookStewFish.getFish();
stewFish.cook();
//油炸鱼
CookFishFactory cookFryFish = new CookFryFishFactory();
Fish fryFish = cookFryFish.getFish();
fryFish.cook();
}
运行结果如下:
蒸鱼
炖鱼
油炸鱼
工厂方法模式定义一个创建产品对象的工厂接口,由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
核心工厂类不再负责产品的创建,成为一个接口,仅为工厂子类提供实现的接口,这样可以在引入新的产品时,不用在修改其它的工厂角色。
抽象工厂角色(CookFishFactory)
工厂方法模式的核心,其它工厂类都必须实现这个接口。
具体工厂角色(CookSteamFishFactory、CookStewFishFactory、CookFryFishFactory)
抽象工厂类的具体实现,负责实例化产品对象。
抽象产品角色(Fish)
工厂方法模式创建所有对象的父类,负责描述所有实例共有的公共接口。
具体产品角色(SteamFish、StewFish、FryFish)
工厂方法模式创建的具体实例化对象。
FactoryMethod