简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式。简单工厂模式通过对外提供一个静态方法来统一为类创建实例。简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建出来的,只需要调用简单工厂模式的方法来统一创建就可以了,从而明确了各个类的职责。
一、创建简单工厂模式的步骤
第一步:声明一个抽象类(接口),以及对应的抽象方法,由实现类分别去实现这个方法。
第二步: 创建具体实现类,实现抽象方法。
第三步:创建一个简单工厂类,声明一个静态方法,根据传入的不同的类型来确定创建抽象类的具体实现类。
第四步:客户端通过工厂类获取实例对象。
二、应用案例:
下面以制造手机为例子,在现实生活中可能有很多工厂可以创建不同品牌的手机,这些工厂可以根据不同的需求来创建不同的手机。根据上面的步骤,首先我们需要一个抽象类,所以我们需要知道不同品牌的手机其实都是属于手机这种类别,因此我们可以将手机抽出来做成一个抽象类:
/** * 手机类 */ public interface Phone { //制造手机的方法,留给具体的实现类来制造 void create(); }
第二步我们需要开始制造不同品牌的手机了:
制造华为手机
public class Huawei implements Phone { @Override public void create() { System.out.println("====正在制造华为手机======"); } }
苹果手机
public class Iphone implements Phone { @Override public void create() { System.out.println("====正在制造苹果手机======"); } }
第三步我们需要创建一个工厂方法,返回手机类。具体制造什么品牌的手机,需要根据传进来的手机名字来决定,因此我们可以这么写:
public class SimpleFactory { public static Phone createPhone(String name) { if ("huawei".equals(name)) return new Huawei(); else return new Iphone(); } }
第四步,手机创建好了,我们就可以使用了,即客户端调用工厂方法创建对象实例
public class Client {
public static void main(String[] args) {
Phone huawei = SimpleFactory.createPhone("huawei");
huawei.create();
Phone iphone = SimpleFactory.createPhone("iphone");
iphone.create();
}
}
//输出结果
====正在制造华为手机======
====正在制造苹果手机======
到这里,简单工厂模式基本已经写完了,仔细看会发现这种方法创建对象违反了ocp原则,每次增加不同品牌手机的时候都需要在工厂方法里添加不同的条件判断。如果手机品牌越来越多,代码看起来非常臃肿,很不利于后期的代码维护。因此,我们改进一下,不要通过手机品牌名称来判断需要创建哪一中对象了,而是客户端想要创建什么对象,只需要传入具体的实现类就可以了,然后通过Java的反射来创建对象。
public class SimpleFactory2 { public static Phone create(Class<? extends Phone> clazz) { try { return clazz.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } }
客户端调用
public class Client { public static void main(String[] args) { Phone huawei = SimpleFactory2.create(Huawei.class); huawei.create(); Phone iphone = SimpleFactory2.create(Iphone.class); iphone.create(); } }
//运行结果
====正在制造华为手机======
====正在制造苹果手机======
经过修改之后,每次增加新的手机品牌时就不用修改工厂方法的逻辑了。但是,还是有一个问题,就是每次创建对象都是通过反射来创建的,所以在性能上是有一定的损耗的。
三、总结:
优点:
1、简单优化了软件体系结构,明确了各自功能模块的职责和权利
2、通过工厂类,外界不需要直接创建具体产品对象,只需要负责消费,不需要关心内部如何创建对象
缺点:
1、改进前的简单工厂模式全部创建逻辑都集中在一个工厂类中,能创建的类只能是考虑到的,如果需要添加新的类,就必须改变工厂类了
2、改进前的简单工厂模式随着具体产品的不断增多,可能会出现共产类根据不同条件创建不同实例的需求,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免功能模块的蔓延,对系统的维护和扩展不利
3、改进后的简单工厂模式主要是使用反射效率会低一些