设计模式【简单工厂模式】+ 英雄不问出处

67 阅读2分钟

前言

  • 前文我们介绍了单例模式,这样再我们偌大的系统中能够有效的减少内存的开销,在JVM领域中简直就是高效的存在。但是单例模式仅仅是从内存的角度出发。但是在实际开发中可能一个类的确需要频繁的创建,这个时候单例模式显然是不可以使用的。
  • 但是这个类有可能创建过程是很麻烦的,那么我们程序员每次都去重复着繁杂的创建过程很明显也是很麻烦的。比如说Mybatis中SqlSession对象就很是麻烦,因为他需要数据源信息,还需要设置mybatis各种参数。
  • 这种情况我们的工厂模式就营运而生了。

服装厂

  • 现在我们需要新建衣服类,衣服的生产又是很麻烦,这个生产的过程我们交给服装厂来做。

服装

public abstract class Clothes
{
    //袖口的数量
    private int wristband=2;
    //领口的数量
    private int neckline=1;
    //穿衣方式
    public void hold()
    {
        System.out.println("我的穿衣方式是从领口");
    }
    public int getWristband()
    {
        return wristband;
    }
    public void setWristband(int wristband)
    {
        this.wristband = wristband;
    }
    public int getNeckline()
    {
        return neckline;
    }
    public void setNeckline(int neckline)
    {
        this.neckline = neckline;
    }
    
    
}
  • 这里就是将衣服进行抽象化,衣服就得有两个袖口一个领口以及服装该已何种方式穿着。但是这个CLothes还是没有具体化定义。比如说衣服的作用。我按照衣服的使用季节简单分为春夏秋冬。
  • 在代码层面上分别对应四个子类。这里就补贴初具体实现类。

工厂

  • 而我们的工厂需要关心的是,你只需要告诉我你需要哪种衣服就可以了。对于客户端你使用会受到两个袖口一个领口的衣服。
public class ClothFactory
{
    public static Clothes createClothes(String type) throws Exception
    {
        Clothes clothes=null;
        switch (type)
        {
        case "spring":
            clothes=new SpringCloth();
            break;
        case "summer":
            clothes=new SummerCloth();
            break;
        case "autumn":
            clothes=new AutumnCloth();
            break;
        default:
            throw new Exception("目前不支持你指定的类型");
        }
        return clothes;
    }
}
  • 再代码层面就是通过客户端的指令生成不同的子类返回。这样客户端就可以拿到Clothers的子类

总结

  • 我们代码上关于子类的创建很简单,但是工厂为我们解决的具体创建的过程。这样再代码层面就是省去了很多重复的创建过程。比如demo中的if判断。
  • 工厂模式就是减少我们对实例创建过程的了解,而将专注力放在对象的使用层面,提高我们开发效率