以下观点仅是个人对于简单工厂模式的理解,如有错误的地方欢迎大家评论指出。
目录
定义:
官方给出的定义是,通过不同的参数创建不同的对象。这个解释貌似实现起来也没有什么难度,这一点通过这个模式的名称就可以看出。另外需要指出的是,简单工厂模式并不在基本设计模式范围内,但是目前依然被广泛使用,比如一些第三方框架和部分Android源码
基本元素
通过模式名称可以了解到,这个模式的基本元素肯定是要包括一个工厂类(FactoryClass)和调用类(Client)的。Client类作为调用者向工厂类传递参数,工厂类用于根据Client类传入的不同参数构建不同的对象(Product)。除了工厂类和调用类之外,简单工厂模式的基本元素还包括最终要通过工厂类创建的各个对象,以及这些对象的抽象类(或者接口)。
示例代码
下面通过一个果汁加工厂的示例来演示一下简单工厂模式。按照上面介绍的基本元素,我们需要一个工厂类FriutFactory,一个水果的接口Friut,两个果汁接口的实现类AppleJuice和OrangeJuice,以及一个调用类Client
接口friut代码如下:friut.java
package simplefactory;
public interface Friut {
void createJuice();
}
friut的两个实现类代码如下AppleJuice.java&OrangeJuice.java
package simplefactory;
public class AppleJuice implements Friut{
private String name;
public AppleJuice(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void createJuice() {
System.out.println("苹果汁");
}
}
package simplefactory;
public class OrangeJuice implements Friut {
private String name;
public OrangeJuice(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void createJuice() {
System.out.println("橘子汁");
}
}
然后创建FriutFactory.java代码如下:
package simplefactory;
public class FriutFactory {
public static Friut createFriut(String name){
Friut friut = null;
if("apple".equals(name)){
friut = new AppleJuice("苹果");
}
if("orange".equals(name)){
friut = new OrangeJuice("橘子");
}
return friut;
}
}
最后通过client类传递不同的参数,生产不同的果汁:
package simplefactory;
public class Client {
public static void main(String[] args) {
// FriutFactory.createFriut("apple").createJuice();
FriutFactory.createFriut("orange").createJuice();
}
}
示例类图
优缺点总结
优点 调用和实现过程分离,调用者并不需要关注内部的实现过程
缺点 违反开闭原则,当有新增加产品的需求时需要增加具体的实现类,并且需要修改工厂类来匹配新增加的产品。当产品较多时工厂类的逻辑会变得越来越复杂,并且由于有过多的条件判断,会导致工厂类的可读性变差。