一.工厂方法模式介绍 工厂,生活中工厂是干什么的,是生产东西的。比如衣服加工厂,我们衣服卖家只需要从厂里面拿衣服,只需要看衣服是否是我想要的,衣服具体生产过程我不需要知道,这个我们就可以任务是简单工厂。 在《设计模式之禅》中用女娲造人来打开工厂模式的入口,把八卦炉比喻成工厂,这个比喻个人感觉很恰当。下面为了和女娲造人的区分开,我还是用加工衣服的例子来讲解下工厂模式。
二.工厂模式运用
我们先来看下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 }
内衣代码
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 }
外套代码
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 }
裤子代码
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 }
工厂方法类
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 }
客户端调用代码
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 }
运行结果
这样子工厂方法我们就写完了,看运行结果是不是也是大家想的到的,现在我们反思下,如果我把工厂方法去了,不也是在调用端实例然后调用接口的三个方法么?
三.总结
上面的反思想过了么,如果想过了,答案是什么呢?现在我们来看下工厂方法比传统方法的优缺点,看完就知道答案了。
优点
1.调用方只知道有个工厂,不知道我有哪些方法
2.通过工厂构建,不用每个都自己构建,减少代码量
缺点
1.比如新增写在就要在方法中新增一个类
我写的代码其实有个弊端,那就是调用方要知道我具体实现的类是哪个,这样子就加大了耦合。
原文地址:https://www.cnblogs.com/zhxcy/p/11230881.html
时间: 2024-10-16 00:26:18