本篇文章中,围绕着家电产品的案例来讲解
简单工厂
在我们的商场创业阶段时,由于投资人想先考验一下我们的经营能力,融资没有给到那么多资金,所以我们只能先卖洗衣机。调研了许久,我们选择美的工厂生产的洗衣机。
首先创建一个洗衣机的公共抽象类,抽象类有所有洗衣机具备的基础功能
/**
* 产品-洗衣机抽象类
* @author liuyang
*/
public abstract class WashingMachine {
/**
* 启动程序
*/
public abstract void start();
/**
* 洗衣服
*/
public abstract void doTheLaundry();
/**
*甩干
*/
public void spinDry(){
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("洗衣服");
}
}
在我们知道了两种洗衣的功能,便决定各订购一台,先试一试,进而,美的工厂开始为我们生产洗衣机。
/**
* 美的洗衣机制造工厂
* @author liuyang
*/
public class MediaFactory {
private final static String HIGH="high";
private final static String LOW="low";
private MediaFactory(){}
public static WashingMachine productionWashingMachineByType(String washingMachineType){
if (HIGH.equals(washingMachineType)){
return new MediaHighWashingMachine();
}
else if (LOW.equals(washingMachineType)){
return new MediaLowWashingMachine();
}
throw new RuntimeException("未知的洗衣机型号");
}
public static WashingMachine productionWashingMachineUseReflection(String className){
try {
Class<?> aClass = Class.forName(className);
Object o = aClass.newInstance();
if (!(o instanceof WashingMachine)){
throw new RuntimeException("未知的洗衣机型号");
}
return (WashingMachine) o;
} catch (Exception e) {
throw new RuntimeException("未知的洗衣机型号");
}
}
}
两种方式去获取洗衣机类
第一种:使用if-else判断洗衣机类型,如果之后美的工厂增加洗衣机类型,那么我们就需要去改动我们的代码,显然不符合设计模式思想中的开闭原则。
第二种:使用Java的反射,来优化获取洗衣机类的方法。
在工厂生产了两种洗衣机之后,我们迫不及待的去试了试
public class TestWashingMachine {
public static void main(String[] args) {
WashingMachine highWashingMachine = MediaFactory.productionWashingMachineUseReflection("pers.ly.designpatterns.factorymode.simplefactory.MediaHighWashingMachine");
highWashingMachine.start();
System.out.println("--------------------------");
WashingMachine lowWashingMachine = MediaFactory.productionWashingMachineByType("low");
lowWashingMachine.start();
}
}
结果:
启动高端洗衣机
高端洗衣机洗衣开始
加热除螨----
超微净泡----
洗衣服
提高洗衣机转速
开始执行甩干
洗衣服结束
--------------------------
启动低端洗衣机
低端洗衣机洗衣开始
洗衣服
开始执行甩干
洗衣服结束
我们对效果十分满意,并开始进货来售卖美的洗衣机。
在我们的努力经营下,商场大卖赚发了,投资人也开心了,进而我们拿到了更多的资金,决定扩大我们商场规模。
进而就发现了简单工厂的弊端,如果还想购买其他工厂生产的洗衣机,例如海尔、小天鹅等,只是美的工厂是不够用,所以我们要对洗衣机工厂再进行抽象来实现不同品牌的工厂。