简单工厂模式
什么是简单工厂模式?
简单工厂模式其实不不能算是经典设计模式,但是它是其他工厂方法模式的基础,是一种创建型模式。
简单工厂模式定义一个工厂类,并根据传入参数的不同返回不同的类的实例,被创建的实例通常具有公共的父类,由于创建实例的方法通常是静态方法,所以还可以称简单工厂模式为静态工厂模式。
简单工厂模式简单粗暴,你想要什么,就传入什么,工厂就生产什么,你无须关注工厂生产的细节。
核心结构
- Factory。工厂角色,负责创建所有产品的实例,是简单工厂模式的核心,外部可以直接调用工厂角色的生产方法。
- Product。抽象产品角色,它是所有具体产品角色的公共父类,提供了具体产品的公共属性和方法,工厂角色只需定义一个返回值类型为抽象产品角色的方法即可,提高了代码的灵活性。
- ConcreteProduct。具体产品角色,它是工厂角色需要生产的对象,每个具体产品角色都继承了抽象产品角色,并可以根据父类的抽象方法个性化。
类图展示
代码分析
推送系统中,经常需要根据人群来装载推送任务,这里,我们将使用简单工厂模式来获取不同推送人群的推送实例。
首先,我们需要定义一个抽象产品角色——推送人群:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/12 0012.
* 简单工厂模式——具体产品
*/
public class AdultGroup extends Group {
@Override
public void select() {
System.out.println("focus on adult");
}
}
接下来,我们需要创建具体产品角色——根据年龄对推送人群进行划分。
青少年人群:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/12 0012.
* 简单工厂模式——具体产品
*/
public class TeenageGroup extends Group {
@Override
public void select() {
System.out.println("focus on teenagers");
}
}
成年人群:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/12 0012.
* 简单工厂模式——具体产品
*/
public class AdultGroup extends Group {
@Override
public void select() {
System.out.println("focus on adult");
}
}
年长人群:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/12 0012.
* 简单工厂模式——具体产品
*/
public class AdultGroup extends Group {
@Override
public void select() {
System.out.println("focus on adult");
}
}
全体人群:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/12 0012.
* 简单抽象工厂模式——具体产品
*/
public class WholeGroup extends Group {
@Override
public void select() {
System.out.println("Focusing on group failed, change to whole group");
}
}
接下来,就是简单工厂模式的核心——工厂角色:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/12 0012.
* 简单工厂模式——生产工厂
*/
public class GroupFactory {
public static Group getGroup(String type) {
Group group;
switch (type) {
case "teenage" :
group = new TeenageGroup();
break;
case "adult" :
group = new AdultGroup();
break;
case "elder" :
group = new ElderGroup();
break;
default:
group = new WholeGroup();
break;
}
return group;
}
}
完活,上测试用例:
/**
* Created by <sunshine> mysunshinedreams@163.com on 2017/1/12 0012.
* 简单抽象工厂模式测试
*/
public class SimpleFactoryTest {
public static void main(String[] args) {
simpleFactoryTest();
}
private static void simpleFactoryTest() {
try {
Group group = GroupFactory.getGroup("teenage");
group.before();
group.select();
group.after();
group = GroupFactory.getGroup("adult");
group.before();
group.select();
group.after();
group = GroupFactory.getGroup("elder");
group.before();
group.select();
group.after();
group = GroupFactory.getGroup("child");
group.before();
group.select();
group.after();
} catch (Exception e) {
e.printStackTrace();
}
}
}
模式总结
优点
- 工厂角色中包含具体产品的生产判断逻辑,外部调用不需要创建具体产品,简单工厂模式实现了对象创建和使用的分离。
- 外部调用无需知道产品角色的具体信息与生产细节,只需根据需求传入指定参数即可获取产品实例。
- 引入了抽象产品角色,提高产品的灵活性和扩展性。
缺点
- 由于所有的产品创建逻辑都集中在工厂角色中,如果工厂角色不可用,会影响系统的正常工作。
- 如果产品角色类过多,会造成工厂角色逻辑过于复杂,不利于系统的扩展和维护。
适用场景
- 产品角色较少,工厂角色中的方法逻辑不是很复杂。
- 外部调用只关心产品实例的获取,不关心产品的生产过程。