简单工厂模式,顾名思义也就是最简单的一种工厂模式,但是也是最好用的一种模式。在介绍工厂模式之前,咱们先来说说为什么要用工厂模式。比如说咱们想买一个电视,一般情况下咱们不可能自己去生产一台电视而是倾向于找厂家买。其实这个厂家就是我们所说的工厂,再来分析一下咱们买这台电视的过程,首先咱们在天猫或者京东上输入电视的品牌。然后天猫或者京东会找厂家来发货,用户只需要知道电视的牌子,而不需要知道整个电视的生产过程。我们Java中也可以把这种生产模式引用进来,也就形成了我们现在的工程模式。
在简单工厂模式中,我们姑且可以把天猫当做一个简单工厂,比如用户想买一台电视。咱们假设天猫这个工厂里面有乐视电视、小米电视还有海信电视。用户现在只需给天猫这个工厂一个标志,比如“乐视”,这时,天猫就会返回给用户一台乐视电视。同理,如果用户此时输入“小米”,天猫就会返回给用户一台小米电视。
咱们来分析一下用户的这一过程涉及到了哪些部分哈,首先咱们有一个天猫这样的工厂,它可以用来生产电视。其次,咱们应该有一个抽象电视类,这个类里面定义了一些电视的基本属性。但是具体的生产过程以及定价应该交给它的子类来做。所以咱们接下来就需要小米电视,乐视电视以及海信电视等这些子类来实现这些具体的生产过程以及定价。最后咱们通过一个客户端就可以通过输入参数来生产这些电视了,具体的实例类图如下图所示:
通过实例类图,咱们就可以通过代码来实现简单工厂模式了。首先,咱们来实现这个公共的抽象父类。
package com.weiyu.simplefactory;
/**
* Created by Sam on 7/14/2016.
*
* 这里是一个抽象类,这里有获取价格以及生产过程这两个抽象方法
*/
public abstract class ITV {
/**
* price方法定义每台电视的售价,具体的售价由其子类来实现
*/
public abstract void price();
/**
* 描述了每台电视的生产过程,具体的生产过程由其子类实现
*/
public abstract void produceProcess();
}
抽象的父类中有price和produceProcess两个方法,分别用来定义每台电视的价格以及电视的生产过程。接着咱们分别来写他的三个子类。
LeTV
package com.weiyu.factory;
/**
* Created by Sam on 7/14/2016.
*/
public class LeTV extends ITV {
@Override
public void price() {
System.out.println("乐视超级电视每台售价5000元");
}
@Override
public void produceProcess() {
System.out.println("乐视电视生产过程由部分国产代工厂以及富士康代工");
}
}
MiTV
package com.weiyu.factory;
/**
* Created by Sam on 7/14/2016.
*/
public class MiTV extends ITV {
@Override
public void price() {
System.out.println("小米电视每台售价4999元");
}
@Override
public void produceProcess() {
System.out.println("小米电视的生产由富士康代工");
}
}
HisenseTV
package com.weiyu.factory;
/**
* Created by Sam on 7/14/2016.
*/
public class HisenseTV extends ITV {
@Override
public void price() {
System.out.println("海信电视每台售价10000元");
}
@Override
public void produceProcess() {
System.out.println("海信电视由自家工厂生产");
}
}
三个子类分别实现了具体的定价以及具体的生产过程。这时候我们需要一个工厂类来生产它了。
package com.weiyu.factory;
/**
* Created by Sam on 7/14/2016.
*/
public class TVFactory {
/**
* 该方法可以通过传入的参数来生产相应的电视
* @param tag:传入的参数
* @return: 返回相应的电视类
*/
public static ITV createTV(String tag){
if("letv".equals(tag)){
return new LeTV();
}else if("mi".equals(tag)){
return new MiTV();
}else if("hisense".equals(tag)){
return new HisenseTV();
}
return null;
}
}
有了工厂类,这时候如果我们再新增一个创维电视类,只需要添加一个类,然后再工厂方法中添加一个记录。用户就可以用来生产创维电视类了,比较方便。
package com.weiyu.factory;
/**
* Created by Sam on 7/14/2016.
*/
public class Client {
public static void main(String[] args){
ITV letv = TVFactory.createTV("letv");
ITV mi = TVFactory.createTV("mi");
ITV hisense = TVFactory.createTV("hisense");
//获取三个电视的生产过程
letv.produceProcess();
mi.produceProcess();
hisense.produceProcess();
//获取三台电视的售价
letv.price();
mi.price();
hisense.price();
}
}
通过给工厂方法传入不同的参数,我们就可以生产出不同品牌的电视。然后可以分别调用电视子类的价格以及生产过程方法,从而可以获取每台电视的价格以及生产过程。最后的结果如下图所示:
学到这,咱们基本上就已经掌握简单工厂模式了,下面一篇我们将介绍工厂模式进阶-一般工厂模式