从设计模式的类型上来说,简单工厂模式属于创建型模式,又叫静态工厂方法模式,但不属于GoF的23种设计模式之一。
简单工厂模式是由一个工厂对象决定创建哪一种产品类的实例,被创建的实例通常都具有共同的父类。实质即是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。(这些产品类继承自同一个父类或接口)
简单工厂模式包括如下三种角色(附完整示例代码):
假设一个淡水鱼养殖场可以生产出3种类型的淡水鱼:草鱼、鲶鱼、鲤鱼,只需要告知淡水鱼的类型,若鱼类型存在,则能够生产。这里养殖场就是简单工厂,草鱼、鲶鱼、鲤鱼都是具体产品。
1.简单工厂
简单工厂角色就是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑,具体构造细节是在一个个if/else分支,或者switch/case分支里面的。工厂类可以被外界直接调用,创建所需的产品对象。
package com.simple_factory;
import com.abstract_product.Freshwaterfish;
import com.concrete_product.Carp;
import com.concrete_product.Catfish;
import com.concrete_product.Grasscarp;
public class Fishfarm {
public static Freshwaterfish produceFish(String type){
if ("草鱼".equals(type)){
return new Grasscarp();
}else if ("鲶鱼".equals(type)){
return new Catfish();
}else if ("".equals(type)){
return new Carp();
}else {
System.out.println("抱歉,本养殖场不生产此鱼");
return null;
}
}
}
2.抽象产品
简单工厂模式所创建的所有对象的父类,它负责描述所有产品实例所共有的公共接口 。
package com.abstract_product;
public interface Freshwaterfish {
//鱼在生长
void grop();
//收获鱼
void harvest();
}
3.具体产品
具体产品是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
package com.concrete_product;
import com.abstract_product.Freshwaterfish;
public class Carp implements Freshwaterfish {
@Override
public void grop() {
System.out.println("鲤鱼在生长");
}
@Override
public void harvest() {
System.out.println("收获鲤鱼");
}
}
package com.concrete_product;
import com.abstract_product.Freshwaterfish;
public class Catfish implements Freshwaterfish {
@Override
public void grop() {
System.out.println("鲶鱼在生长");
}
@Override
public void harvest() {
System.out.println("收获鲶鱼");
}
}
package com.concrete_product;
import com.abstract_product.Freshwaterfish;
public class Grasscarp implements Freshwaterfish {
@Override
public void grop() {
System.out.println("草鱼在生长");
}
@Override
public void harvest() {
System.out.println("收获草鱼");
}
}
客户测试类:
package com.test;
import com.abstract_product.Freshwaterfish;
import com.simple_factory.Fishfarm;
public class Test {
public static void main(String[] args) {
Freshwaterfish myCarp = Fishfarm.produceFish("鲶鱼");
if (myCarp != null){
myCarp.grop();
myCarp.harvest();
}
}
}
简单工厂模式优点:
1.工厂类含有必要的判断逻辑,能够决定在什么时候创建哪一个产品类的实例,客户端可免除直接创建产品对象的步骤操作,而仅仅“使用”产品。使得对象的创建与对象的使用分离,有利于对功能的复用和系统的维护。
2.客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少用户的记忆量。
3.通过引入配置文件,能够在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
简单工厂模式缺点:
1.由于工厂类中集中了所有产品创建的实现逻辑,一旦它不能够正常工作,则整个系统都会受到影响。
2.系统拓展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。
适用场景
1.工厂类负责创建的对象比较少;
2.客户只知道传入工厂类的参数名,对于如何创建对象的逻辑实现并不关心;
3.由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。