工厂模式
上篇说道,我们的商场在赚到第一桶金后,想要扩充洗衣机的进货渠道,好让消费者有更多的选择,原本只有一个美的洗衣机工厂是远远不够的
现在我们着手来改造工厂类,将洗衣机工厂的共性抽象成为借口或者抽象类
/**
* 洗衣机制造工厂
* @author liuyang
*/
public interface WashingMachineFactory {
//高端
String HIGH="high";
//低端
String LOW="low";
/**
* 根据洗衣机类型创建洗衣机
* @param washingMachineType
* @return
*/
WashingMachine createWashingMachineByType(String washingMachineType);
}
这次我们引进了美的以及海尔两家洗衣机工厂
/**
* 海尔洗衣机制造工厂
* @author liuyang
*/
public class HairWashingMachineFactory implements WashingMachineFactory{
@Override
public WashingMachine createWashingMachineByType(String washingMachineType) {
if (HIGH.equals(washingMachineType)){
return new HairHighWashingMachine();
}
else if (LOW.equals(washingMachineType)){
return new HairLowWashingMachine();
}
throw new RuntimeException("未知的洗衣机型号");
}
}
/**
* 美的洗衣机制造工厂
* @author liuyang
*/
public class MediaWashingMachineFactory implements WashingMachineFactory{
@Override
public WashingMachine createWashingMachineByType(String washingMachineType) {
if (HIGH.equals(washingMachineType)){
return new MediaHighWashingMachine();
}
else if (LOW.equals(washingMachineType)){
return new MediaLowWashingMachine();
}
throw new RuntimeException("未知的洗衣机型号");
}
}
海尔洗衣机工厂生产两种机型
/**
* 海尔高端洗衣机
* @author liuyang
*/
public class HairHighWashingMachine extends WashingMachine{
@Override
public void start() {
System.out.println("启动海尔高端洗衣机");
this.doTheLaundry();
this.highSpeedDryer();
System.out.println("洗衣服结束");
}
@Override
public void doTheLaundry() {
System.out.println("海尔高端洗衣机洗衣开始");
System.out.println("加热除螨----");
System.out.println("超微净泡----");
System.out.println("洗衣服");
}
public void highSpeedDryer(){
System.out.println("提高洗衣机转速");
this.spinDry();
}
}
/**
* 海尔低端洗衣机
* @author liuyang
*/
public class HairLowWashingMachine extends WashingMachine {
@Override
public void start() {
System.out.println("启动海尔低端洗衣机");
this.doTheLaundry();
this.spinDry();
System.out.println("洗衣服结束");
}
@Override
public void doTheLaundry() {
System.out.println("海尔低端洗衣机洗衣开始");
System.out.println("洗衣服");
}
}
美的洗衣机工厂生产两种机型
/**
* 美的高端洗衣机
* @author liuyang
*/
public class MediaHighWashingMachine extends WashingMachine {
@Override
public void start() {
System.out.println("启动美的高端洗衣机");
this.doTheLaundry();
this.highSpeedDryer();
System.out.println("洗衣服结束");
}
@Override
public void doTheLaundry() {
System.out.println("美的高端洗衣机洗衣开始");
System.out.println("加热除螨----");
System.out.println("超微净泡----");
System.out.println("洗衣服");
}
public void highSpeedDryer(){
System.out.println("提高洗衣机转速");
this.spinDry();
}
}
/**
* 美的低端洗衣机
* @author liuyang
*/
public class MediaLowWashingMachine extends WashingMachine {
@Override
public void start() {
System.out.println("启动美的低端洗衣机");
this.doTheLaundry();
this.spinDry();
System.out.println("洗衣服结束");
}
@Override
public void doTheLaundry() {
System.out.println("美的低端洗衣机洗衣开始");
System.out.println("洗衣服");
}
}
在选好厂家之后,两家洗衣机工厂分别为我们生产2种机型,让我们开始运行洗衣机吧
public class TestWashingMachine {
public static void main(String[] args) {
WashingMachine mediaHighWashingMachine = new MediaWashingMachineFactory().createWashingMachineByType("high");
mediaHighWashingMachine.start();
System.out.println("--------------------------");
WashingMachine mediaLowWashingMachine = new MediaWashingMachineFactory().createWashingMachineByType("low");
mediaLowWashingMachine.start();
System.out.println("--------------------------");
WashingMachine hairHighWashingMachine = new HairWashingMachineFactory().createWashingMachineByType("high");
hairHighWashingMachine.start();
System.out.println("--------------------------");
WashingMachine hairLowWashingMachine = new HairWashingMachineFactory().createWashingMachineByType("low");
hairLowWashingMachine.start();
}
}
结果:
启动美的高端洗衣机
美的高端洗衣机洗衣开始
加热除螨----
超微净泡----
洗衣服
提高洗衣机转速
开始执行甩干
洗衣服结束
--------------------------
启动美的低端洗衣机
美的低端洗衣机洗衣开始
洗衣服
开始执行甩干
洗衣服结束
--------------------------
启动海尔高端洗衣机
海尔高端洗衣机洗衣开始
加热除螨----
超微净泡----
洗衣服
提高洗衣机转速
开始执行甩干
洗衣服结束
--------------------------
启动海尔低端洗衣机
海尔低端洗衣机洗衣开始
洗衣服
开始执行甩干
洗衣服结束
工厂模式下,如果我们想增加洗衣机工厂或者增加洗衣机的种类,只需要我们再次实现一个工厂接口或者增加一个洗衣机种类并继承洗衣机抽象类交由工厂创建,这样完全符合了开闭原则,只增加代码,不去修改之前的代码。
此次引进多家洗衣机工厂,我们又又又又赚发了,获得了更多的¥¥¥¥¥,商场进而决定进军冰箱行业,此时我们的洗衣机抽象类显然不够用了
这就暴露了工厂模式的弊端,只能有单一的商品种类,如果增加了其他类型的家电,显然也是难以实现的。