工厂模式(1)

228 阅读3分钟

本篇文章中,围绕着家电产品的案例来讲解

简单工厂

在我们的商场创业阶段时,由于投资人想先考验一下我们的经营能力,融资没有给到那么多资金,所以我们只能先卖洗衣机。调研了许久,我们选择美的工厂生产的洗衣机。

首先创建一个洗衣机的公共抽象类,抽象类有所有洗衣机具备的基础功能

/**
 * 产品-洗衣机抽象类 
 * @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();    
    }
}



结果:

启动高端洗衣机
高端洗衣机洗衣开始
加热除螨----
超微净泡----
洗衣服
提高洗衣机转速
开始执行甩干
洗衣服结束
--------------------------
启动低端洗衣机
低端洗衣机洗衣开始
洗衣服
开始执行甩干
洗衣服结束

我们对效果十分满意,并开始进货来售卖美的洗衣机。

在我们的努力经营下,商场大卖赚发了,投资人也开心了,进而我们拿到了更多的资金,决定扩大我们商场规模。

进而就发现了简单工厂的弊端,如果还想购买其他工厂生产的洗衣机,例如海尔、小天鹅等,只是美的工厂是不够用,所以我们要对洗衣机工厂再进行抽象来实现不同品牌的工厂。