码迷,mamicode.com
首页 > 其他好文 > 详细

23种设计模式-工厂方法模式

时间:2019-07-23 15:02:46      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:图片   star   pac   内衣   turn   构建   name   通过   class   

一.工厂方法模式介绍
工厂,生活中工厂是干什么的,是生产东西的。比如衣服加工厂,我们衣服卖家只需要从厂里面拿衣服,只需要看衣服是否是我想要的,衣服具体生产过程我不需要知道,这个我们就可以任务是简单工厂。
设计模式之禅》中用女娲造人来打开工厂模式的入口,把八卦炉比喻成工厂,这个比喻个人感觉很恰当。下面为了和女娲造人的区分开,我还是用加工衣服的例子来讲解下工厂模式。

二.工厂模式运用
   我们先来看下UML图

技术图片

图画的好不好,烂不烂我们先不说(我感觉怎么那么不专业)。从图中能看出我们需要创建一个服装接口,有start,colour,package三个方法,然后所有的衣服都实现服装接口,然后工厂类去构建各种衣服。

接口类代码
技术图片
 1 public interface IClothing {
 2 
 3     /**
 4      * 开始制作
 5      */
 6     void start();
 7     /**
 8      * 上色
 9      */
10     void colour();
11     /**
12      * 打包
13      */
14     void pack();
15 }
View Code
内衣代码
技术图片
 1 public class Underwear implements IClothing {
 2 
 3     public void start()
 4     {
 5         System.out.println("正在制作内衣...");
 6     }
 7     public void colour()
 8     {
 9         System.out.println("给内衣上色...");
10     }
11     public void pack()
12     {
13         System.out.println("内衣制作完包装...");
14     }
15 }
View Code
外套代码
技术图片
 1 public class Coat implements IClothing {
 2 
 3     public void start()
 4     {
 5         System.out.println("正在制作外套...");
 6     }
 7     public void colour()
 8     {
 9         System.out.println("给外套上色...");
10     }
11     public void pack()
12     {
13         System.out.println("外套制作完包装...");
14     }
15 
16 }
View Code

   裤子代码

技术图片
 1 public class Trousers {
 2 
 3     public void start()
 4     {
 5         System.out.println("正在制作裤子...");
 6     }
 7     public void colour()
 8     {
 9         System.out.println("给裤子上色...");
10     }
11     public void pack()
12     {
13         System.out.println("裤子制作完包装...");
14     }
15 
16 }
View Code

   工厂方法类

技术图片
 1 public class ClothingFactory {
 2 
 3     public static IClothing createClothing(Class c)
 4     {
 5         IClothing traffic = null;
 6         try {
 7             traffic =(IClothing)Class.forName(c.getName()).newInstance();
 8         }catch (InstantiationException e)
 9         {
10             throw new RuntimeException("对象创建出错");
11         }
12         catch (IllegalAccessException e)
13         {
14             throw new RuntimeException("你调用错了吧");
15         }
16         catch (ClassNotFoundException e)
17         {
18             throw new RuntimeException("类都找不到你让我怎么搞");
19         }
20         return traffic;
21     }
22 }
View Code

  客户端调用代码

技术图片
 1 public static void main(String [] args)
 2     {
 3         IClothing underwear = ClothingFactory.createClothing(Underwear.class);
 4         underwear.start();
 5         underwear.colour();
 6         underwear.pack();
 7         IClothing coat = ClothingFactory.createClothing(Coat.class);
 8         coat.start();
 9         coat.colour();
10         coat.pack();
11         IClothing trousers = ClothingFactory.createClothing(Trousers.class);
12         trousers.start();
13         trousers.colour();
14         trousers.pack();
15     }
View Code

运行结果

技术图片

这样子工厂方法我们就写完了,看运行结果是不是也是大家想的到的,现在我们反思下,如果我把工厂方法去了,不也是在调用端实例然后调用接口的三个方法么?

 

三.总结

上面的反思想过了么,如果想过了,答案是什么呢?现在我们来看下工厂方法比传统方法的优缺点,看完就知道答案了。

优点

1.调用方只知道有个工厂,不知道我有哪些方法

2.通过工厂构建,不用每个都自己构建,减少代码量

缺点

1.比如新增写在就要在方法中新增一个类

 

我写的代码其实有个弊端,那就是调用方要知道我具体实现的类是哪个,这样子就加大了耦合。

 




23种设计模式-工厂方法模式

标签:图片   star   pac   内衣   turn   构建   name   通过   class   

原文地址:https://www.cnblogs.com/zhxcy/p/11230881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!