标准 专业
多元 极客

设计模式实验室(15)——简单工厂模式

简单工厂模式

什么是简单工厂模式?

简单工厂模式其实不不能算是经典设计模式,但是它是其他工厂方法模式的基础,是一种创建型模式。

简单工厂模式定义一个工厂类,并根据传入参数的不同返回不同的类的实例,被创建的实例通常具有公共的父类,由于创建实例的方法通常是静态方法,所以还可以称简单工厂模式为静态工厂模式。

简单工厂模式简单粗暴,你想要什么,就传入什么,工厂就生产什么,你无须关注工厂生产的细节。

核心结构

  • 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();
        }
    }
}

模式总结

优点

  • 工厂角色中包含具体产品的生产判断逻辑,外部调用不需要创建具体产品,简单工厂模式实现了对象创建和使用的分离。
  • 外部调用无需知道产品角色的具体信息与生产细节,只需根据需求传入指定参数即可获取产品实例。
  • 引入了抽象产品角色,提高产品的灵活性和扩展性。

缺点

  • 由于所有的产品创建逻辑都集中在工厂角色中,如果工厂角色不可用,会影响系统的正常工作。
  • 如果产品角色类过多,会造成工厂角色逻辑过于复杂,不利于系统的扩展和维护。

适用场景

  • 产品角色较少,工厂角色中的方法逻辑不是很复杂。
  • 外部调用只关心产品实例的获取,不关心产品的生产过程。
赞(0) 投币

评论 抢沙发

慕勋的实验室慕勋的研究院

码字不容易,路过请投币

支付宝扫一扫

微信扫一扫