关于设计模式相关的讲解应该有很多。在这里只是简单写一下自己的理解。做个记忆加深,若有可能再跟上一点交流。
其实在工厂模式之前,应该先大概理解什么是工厂模式,为什么一个工厂模式还分为简单工厂模式、工厂方法模式与抽象工厂模式。
工厂模式顾名思义就是类似于现实社会的工厂一样的模式(其实设计模式很多都是来源于生活,做了抽象。之后又去指导生活)。
在封建社会里,大家都是自给自足。什么东西都是自己来创建(new)。造成了资源的浪费,社会也进步有限。最主要的是,慢慢的大家发现,自己做的没有别人家的好。我仅需要原来耗费材料的部分就可以去交换其他人创建的更好的物品。这就是刚开始的简单工厂模式的雏形。
举个栗子:
/** * 简单的牛奶接口,后续的其他实现都会有牛奶的基本属性(白白的,液体) */public interface IMilk { public String createMilk(); }
因为我们可能会需要不同的牛奶,所以会有不同的牛奶实现
public class MengniuMilkimplements IMilk { @Override public StringcreateMilk() { return "蒙牛 天生要强!"; } }
public class SanYuanMilkimplements IMilk { @Override public StringcreateMilk() { return "好牛奶,三元造!"; } }
再来罐伊利
public class YiLiMilkimplements IMilk { @Override public StringcreateMilk() { return "好牛,好奶!好伊利!"; } }
至此我们已经创建了三种牛奶的实现,在简单工厂模式下会如何处理呢?
public class SimpleFactory { //注意:若不使用 final关键字 会报constant expression required的编译期错误 //case语句后面必须是常量,使用final修饰 public static final int MENGNIU_TYPE =1; public static final int YILI_TYPE =2; public static final int SANYUAN_TYPE =3; public static IMilkcreateDiffMilk(Integer milkType){ switch (milkType){ case MENGNIU_TYPE: return new MengniuMilk(); case YILI_TYPE: return new YiLiMilk(); case SANYUAN_TYPE: return new SanYuanMilk(); default: return null; } } }
那么我们该如何喝到想喝的牛奶呢?
public class SimpleTest { public static void main(String[] args) { //比如我们要喝蒙牛的牛奶,仅需要 IMilk mengniu = SimpleFactory.createDiffMilk(SimpleFactory.MENGNIU_TYPE); IMilk yili = SimpleFactory.createDiffMilk(SimpleFactory.YILI_TYPE); IMilk sanyuan = SimpleFactory.createDiffMilk(SimpleFactory.SANYUAN_TYPE); System.out.println(mengniu.createMilk()); System.out.println(yili.createMilk()); System.out.println(sanyuan.createMilk()); } } }
类图如下
image
1 它是一个具体的类,非接口 抽象类。有一个重要的createDiffMilk()方法,利用if或者 switch创建产品并返回。
2 createDiffMilk()方法通常是静态的,所以也称之为静态工厂。
作者:YannisChen_2017
链接:https://www.jianshu.com/p/08df8b93c8e8