1、Java工厂模式今天继续设计模式之旅,给大家带来工厂模式,简单列一下这个模式的家族:1、静态工厂模式2、简单工厂模式3、工厂方法模式4、抽象工厂模式是不是觉得,我勒个去,这工厂还能列出这么多分类,哈哈,下面开始各个击破。1、静态工厂模式这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。下面开始详细介绍:略。2、简单工厂模式下面开始谈谈卖肉夹馍,最近程序员卖肉夹馍很火,啥时候大牛们都去卖了,我等就崛起了,哈哈。首先你得有个店:RoujiaMoStorejava view plain copy1. packagecom.zhy.pattern.factory.a;2.
2、 3. publicclassRoujiaMoStore4. 5. 6. /*7. *根据传入类型卖不同的肉夹馍8. *9. *paramtype10. *return11. */12. publicRouJiaMosellRouJiaMo(Stringtype)13. 14. RouJiaMorouJiaMo=null;15. 16. if(type.equals(Suan)17. 18. rouJiaMo=newSuanRouJiaMo();19. 20. elseif(type.equals(Tian)21. 22. rouJiaMo=newTianRouJiaMo();23. else
3、if(type.equals(La)24. 25. rouJiaMo=newLaRouJiaMo();26. 27. 28. rouJiaMo.prepare();29. rouJiaMo.fire();30. rouJiaMo.pack();31. returnrouJiaMo;32. 33. 34. 然后你得有各种风味的馍馍:java view plain copy1. packagecom.zhy.pattern.factory.a;2. 3. publicabstractclassRouJiaMo4. 5. protectedStringname;6. 7. /*8. *准备工作9.
4、*/10. publicvoidprepare()11. 12. System.out.println(揉面-剁肉-完成准备工作);13. 14. 15. /*16. *使用你们的专用袋-包装17. */18. publicvoidpack()19. 20. System.out.println(肉夹馍-专用袋-包装);21. 22. /*23. *秘制设备-烘烤2分钟24. */25. publicvoidfire()26. 27. System.out.println(肉夹馍-专用设备-烘烤);28. 29. java view plain copy1. packagecom.zhy.pa
5、ttern.factory.a;2. 3. importcom.zhy.pattern.factory.a.RouJiaMo;4. 5. /*6. *辣味肉夹馍7. *8. *authorzhy9. *10. */11. publicclassLaRouJiaMoextendsRouJiaMo12. 13. publicLaRouJiaMo()14. 15. this.name=辣味肉夹馍;16. 17. java view plain copy1. packagecom.zhy.pattern.factory.a;2. 3. 4. 5. /*6. *酸味肉夹馍7. *8. *authorzh
6、y9. *10. */11. publicclassSuanRouJiaMoextendsRouJiaMo12. 13. publicSuanRouJiaMo()14. 15. this.name=酸味肉夹馍;16. 17. java view plain copy1. packagecom.zhy.pattern.factory.a;2. 3. 4. 5. /*6. *酸味肉夹馍7. *8. *authorzhy9. *10. */11. publicclassSuanRouJiaMoextendsRouJiaMo12. 13. publicSuanRouJiaMo()14. 15. thi
7、s.name=酸味肉夹馍;16. 17. 现在这样的设计,虽然可以支持你卖肉夹馍了,但是有点问题,生产馍的种类和你的RoujiaMoStore耦合度太高了,如果增加几种风味,删除几种风味,你得一直修改sellRouJiaMo中的方法,所以我们需要做一定的修改,此时简单工厂模式就能派上用场了。我们开始写个简单工厂,把产生馍的过程拿出来:java view plain copy1. packagecom.zhy.pattern.factory.a;2. 3. publicclassSimpleRouJiaMoFactroy4. 5. publicRouJiaMocreateRouJiaMo(Str
8、ingtype)6. 7. RouJiaMorouJiaMo=null;8. if(type.equals(Suan)9. 10. rouJiaMo=newSuanRouJiaMo();11. 12. elseif(type.equals(Tian)13. 14. rouJiaMo=newTianRouJiaMo();15. elseif(type.equals(La)16. 17. rouJiaMo=newLaRouJiaMo();18. 19. returnrouJiaMo;20. 21. 22. 然后以组合的方式,让Store来使用:java view plain copy1. pack
9、agecom.zhy.pattern.factory.a;2. 3. publicclassRoujiaMoStore4. 5. privateSimpleRouJiaMoFactroyfactroy;6. 7. publicRoujiaMoStore(SimpleRouJiaMoFactroyfactroy)8. 9. this.factroy=factroy;10. 11. 12. /*13. *根据传入类型卖不同的肉夹馍14. *15. *paramtype16. *return17. */18. publicRouJiaMosellRouJiaMo(Stringtype)19. 20.
10、 RouJiaMorouJiaMo=factroy.createRouJiaMo(type);21. rouJiaMo.prepare();22. rouJiaMo.fire();23. rouJiaMo.pack();24. returnrouJiaMo;25. 26. 27. 好了,现在你随便添加什么种类的馍,删除什么种类的馍就和Store无关了,就是么人家只负责卖馍么 这就是简单工厂模式,当然了,大家也都比较熟悉。3、工厂方法模式定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。好了,看完定义,下面我们用例子来展示。继续肉夹馍,由于使
11、用了简单工厂模式,肉夹馍生意那个好啊,所以下载决定去西安开个分店,去北京开个分店。既然有分店了,那总店就是抽象的了:java view plain copy1. packagecom.zhy.pattern.factory.b;2. 3. publicabstractclassRoujiaMoStore4. 5. 6. publicabstractRouJiaMocreateRouJiaMo(Stringtype);7. 8. /*9. *根据传入类型卖不同的肉夹馍10. *11. *paramtype12. *return13. */14. publicRouJiaMosellRouJiaM
12、o(Stringtype)15. 16. RouJiaMorouJiaMo=createRouJiaMo(type);17. rouJiaMo.prepare();18. rouJiaMo.fire();19. rouJiaMo.pack();20. returnrouJiaMo;21. 22. 23. 然后在开两个分店,这里拿一个代码做演示,其他都一样:java view plain copy1. packagecom.zhy.pattern.factory.b;2. 3. 4. 5. /*6. *西安肉夹馍店7. *8. *authorzhy9. *10. */11. publicclas
13、sXianRouJiaMoStoreextendsRoujiaMoStore12. 13. 14. Override15. publicRouJiaMocreateRouJiaMo(Stringtype)16. 17. RouJiaMorouJiaMo=null;18. if(type.equals(Suan)19. 20. rouJiaMo=newXianSuanRouJiaMo();21. 22. elseif(type.equals(Tian)23. 24. rouJiaMo=newXianTianRouJiaMo();25. elseif(type.equals(La)26. 27.
14、rouJiaMo=newXianLaRouJiaMo();28. 29. returnrouJiaMo;30. 31. 32. 33. 然后就是各个西安口味的肉夹馍了,这代码就不贴了。可以看出我们把制作肉夹馍的过程以抽象方法的形式让子类去决定了,对照定义:1、定义了创建对象的一个接口:public abstract RouJiaMo createRouJiaMo(String type);2、由子类决定实例化的类,可以看到我们的馍是子类生成的。可能有人会说,我用简单工厂模式也行啊,但是如果10来个城市*5种风味/城市,那么岂不是简单工厂里面需要50多个if,再说人家西安肉夹馍分店就不能有点自己
15、的秘诀,当然由它自己定最好。好了,方法工厂模式介绍完毕。4、抽象工厂模式定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。这定义有点绕口,算了,还是拿例子来说。继续卖肉夹馍,咱们生意这么好,难免有些分店开始动歪脑子,开始使用劣质肉等,砸我们的品牌。所以我们要拿钱在每个城市建立自己的原料场,保证高质量原料的供应。于是我们新建一个提供原料的接口:java view plain copy1. packagecom.zhy.pattern.factory.b;2. 3. /*4. *提供肉夹馍的原料5. *authorzhy6. *7. */8. publicinterfac
16、eRouJiaMoYLFactroy9. 10. /*11. *生产肉12. *return13. */14. publicMeatcreateMeat();15. 16. /*17. *生产调料神马的18. *return19. */20. publicYuanLiaocreateYuanliao();21. 22. java view plain copy1. packagecom.zhy.pattern.factory.b;2. 3. /*4. *根据西安当地特色,提供这两种材料5. *authorzhy6. *7. */8. publicclassXianRouJiaMoYLFactr
17、oyimplementsRouJiaMoYLFactroy9. 10. 11. Override12. publicMeatcreateMeat()13. 14. returnnewFreshMest();15. 16. 17. Override18. publicYuanLiaocreateYuanliao()19. 20. returnnewXianTeSeYuanliao();21. 22. 23. 有了原理工厂,那我们稍微修改下RouJiaMo的prepare方法:java view plain copy1. packagecom.zhy.pattern.factory.b;2. 3.
18、 publicabstractclassRouJiaMo4. 5. protectedStringname;6. 7. /*8. *准备工作9. */10. publicfinalvoidprepare(RouJiaMoYLFactroyylFactroy)11. 12. Meatmeat=ylFactroy.createMeat();13. YuanLiaoyuanliao=ylFactroy.createYuanliao();14. System.out.println(使用官方的原料+meat+,+yuanliao+作为原材料制作肉夹馍);15. 16. 17. /*18. *使用你们的
19、专用袋-包装19. */20. publicfinalvoidpack()21. 22. System.out.println(肉夹馍-专用袋-包装);23. 24. 25. /*26. *秘制设备-烘烤2分钟27. */28. publicfinalvoidfire()29. 30. System.out.println(肉夹馍-专用设备-烘烤);31. 32. 好了,现在必须用我们官方原料做为原材料了。现在对比定义:1、提供一个接口:public interface RouJiaMoYLFactroy2、用于创建相关的或依赖对象的家族public Meat createMeat();pub
20、lic YuanLiao createYuanliao();我们接口用于创建一系列的原材料。好了,最后测试下,我要在西安馍店,买个酸味的尝尝:java view plain copy1. packagecom.zhy.pattern.factory.b;2. 3. 4. publicclassTest5. 6. publicstaticvoidmain(Stringargs)7. 8. 9. RoujiaMoStoreroujiaMoStore=newXianRouJiaMoStore();10. RouJiaMosuanRoujiaMo=roujiaMoStore.sellRouJiaMo(Suan);11. System.out.println(suanRoujiaMo.name);12. 13. java view plain copy1. 使用官方的原料com.zhy.pattern.factory.b.FreshMeste53108,com.zhy.pattern.factory.b.XianTeSeYuanliaof62373作为原材料制作肉夹馍2. 肉夹馍-专用设备-烘烤3. 肉夹馍-专用袋-包装4. 酸味肉夹馍哈哈肉夹馍店的已经建立起来了,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1