工厂模式2

  1. 工厂模式是一种创建型模式。。。其中创建型模式包括:单例,工厂,建造者,原型四种  
  2.   /* 为什么要工厂方法: 
  3. 1.因为我想控制产生交通工具的生产过程 
  4. 2.工厂模式符合OCP原则,也就是开闭原则, 
  5. 3。抽象工厂还有个最大优点,高内聚,低耦合,内聚都高到new的地方都转移到了一个类中来维护 
  6.  
  7. 工厂的共性是: 能生产多种产品,所以要具体产品类和抽象产品类,当然有一个具体工厂哈 
  8.  
  9.  
  10. 工厂模式分为三种: 
  11. 简单工厂模式(有些人又把简单工厂模式看成是工厂方法模式的一种特例), 
  12. 工厂方法模式, 
  13. 抽象工厂模式。 
  14.  
  15. */  
  16. -------------------------没有工厂的时候-------------------------------------------------  
  17. //当你控制了他的生产过程之后,像这样的代码就可以解耦了  
  18. UserDao userDao = new UserDaoImpl(); //这个代码是依赖于UserDaoImpl的实现的,如果想要换个类,那么这个地方时需要改动的,也就是说用到的地方要改,被用到的地方也要改。。  
  19. ---------------------------工厂来了-----------------------------------------------  
  20.   
  21.   
  22.  简单工厂模式:优点:工厂类中包含了必要的逻辑判断(switch或者if/else),根据客户端的选择条件动态实例化相关的类,对客户端来说,去除了与具体产品的依赖。。。问题:因为需求变更后,我们需要修改原有的工厂类(至少要加case条件吧),这样违背了开放-封闭原则。  
  23.   
  24. 还有优点,他们转移了new,使得更换对象不需要大幅度修改。。。  
  25.   
  26.   
  27. 它具有三个角色: 抽象产品角色,具体产品角色, 工厂类角色(new 的管理者)  
  28.   
  29. 一个工厂生产一种类别的产品。。。。。。。。  
  30.   
  31. 暴发户只要在车里面说一句:"开车"就可以了  
  32. //抽象产品角色  
  33. public interface Car{  
  34.   
  35.   public void drive();  
  36. }  
  37.   
  38. 具体产品角色  
  39. public class Benz implements Car{  
  40.    public void drive(){  
  41.         System.out.println("Driving Benz");  
  42.    }  
  43. }  
  44.   
  45. public class BMW implements Car{  
  46.    public void drive(){  
  47.        System.out.println("Driving BMW");  
  48.    }  
  49.     
  50. }  
  51. //工厂类角色  
  52. public class Driver{  
  53.   
  54.   public static Car driverCar(String s){  
  55.       if(s.equals("Benz"))return new Benz();  
  56.       if(s.equals("BMW"))return new BMW();  
  57.   }  
  58. }  
  59.   
  60. //例子二  
  61. public class SimplePizzaFactory{  
  62.     public Pizza createPizza(String type){  
  63.        Pizza p = null;  //抽象产品类  
  64.        if(type.equals("cheese")){  
  65.             p = new CheesePizza();//具体产品类  
  66.        }else if(type.equals("pepperoni")){  
  67.             p = new PepperoniPizza();  
  68.        }else if(type.equals("veggie")){  
  69.            p = new VeggiePizza();  
  70.        }  
  71.         return p;      
  72.      }  
  73. }  
  74.   
  75.   
  76. ---------------------------忧郁的分割线----------------------------------------------  
  77.   
  78. 下面是工厂方法:  
  79. 工厂方法模式就是为了去除简单工厂中的if/else或者switch/case来做的,他定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。  
  80. 但是但是但是:工厂方法模式实现时,客户端需要决定实例化哪一个工厂,也就是说,工厂方法把简单工厂的内部逻辑判断已到了客户端代码来进行。。。。  
  81.   
  82. 我们想想他存在的意义,如果制造一辆汽车的过程只是一个new xxxCar();那么不要使用工厂,如果制造汽车的过程是  xxxxx;xxxxxx;xxxxx;.....; new xxxCar();xxxxx; 那么使用工厂方法模式,他可以使得知道汽车的这一系列的过程被封在起来,因为制造工厂的过程简单。。。  
  83.   
  84.   
  85. 组成: 抽象工厂角色(工厂就开始抽象了哈),具体工厂角色,抽象产品角色,具体产品角色  
  86.   
  87.   
  88. //抽象工厂角色  
  89. public interface Driver{  
  90.    public Car driverCar();  
  91. }  
  92. //具体工厂角色  
  93. public class BenzDriver implements Driver{  
  94.    public Car driverCar(){  
  95.       return new Benz();  
  96.    }  
  97.   
  98. }  
  99.  //具体工厂角色  
  100. public class BMWDriver implements Driver{  
  101.    public Car driverCar(){  
  102.      return new BMW();  
  103.    }  
  104. }  
  105.   
  106. ...产品类省略  
  107.   
  108. 使用:  
  109.   
  110. Driver driver = new BenzDriver();  
  111. Car car = driver.driverCar();  
  112.   
  113. 对比简单工厂模式: Car car = Driver.driverCar("benz");  
  114.   
  115. -----------------抽象工厂---------------------------------------------------------  
  116.   
  117. /* 
  118. 因为我们想让一个工厂生产不同的产品, 
  119. 比如说我们想产生不同的交通工具,那么就要有不同的交通工具工厂的实现,每一个具体的工厂负责他对应的产品的控制 
  120. */  
  121. public abstract class Factory{  
  122.     public abstract Vihecle create();   
  123. //这里使得所有工厂产生的产品有一个共性,他们还只能产生Vihecle的子类,或者让他们产生有Moveable接口的东西也可以  
  124. }  
  125.   
  126. public class CarFactory extends Factory{  
  127.     public Vihecle create(){  
  128.        
  129.     }  
  130. }  
  131.     
  132.   
  133. /** 
  134.  如果一个工厂里面不是产生一个产品,而是产生一系列的产品 
  135. */  
  136.   
  137. public class DefaultFactory{  
  138.      public void createCar(){}  
  139.      public void createAK47(){}  
  140.      public void createApple(){}  
  141. }  
  142.   
  143. /* 
  144. 如果要扩展的话,上面的写法不好。。。 
  145. 所以创建一个他们的父亲工厂,其实实质和工厂方法是一样的,只不过多了几个工厂而已 
  146. 嘿嘿。。。换皮肤的软件就是这么搞的 
  147. */  
  148.   
  149. public abstract class Factory{  
  150.      public abstract void createVehicle();  
  151.      public abstract void createWeapon();  
  152.      public abstract void createFood(){};  
  153. }  
  154. /* 
  155. 工厂和抽象工厂最大的区别:工厂利于扩展产品,但要扩展产品系列的话则会导致工厂泛滥, 
  156. 抽象工厂利于产生产品系列,但对于扩展产品来说(比如要加一个Flower,则不但要改Factory而且要改所有Factory的子类) 
  157. */  
  158.   
  159.   
  160.   
  161. -----------------配置文件与工厂的配合----------------------------------------------------------  
  162.   
  163.   
  164. //下面是利用配置文件来指定类的工厂。。。。模拟Spring的Bean工厂  
  165. //我们把要new 的东西放入配置文件中,这里配置文件里是这样  aakey=com.zhe.Car  
  166. public class Test{  
  167.      public Car create(){  
  168.          Properties p = new Properties();  
  169.          p.load(Test.class.getClassLoader()  
  170.            .getResourceAsStream("com/zhe/a.properties"));  
  171.          String classString = p.getProperty("aakey");  
  172.          Object o =  Class.forName(classString ).getInstance();  
  173.          //注意会调用空的构造函数  
  174.            Car car = (Car)o;  
  175.          car.run();  
  176.      }  
  177. }  
  178.   
  179. //下面采用Spring自己的Bean工厂  
  180. //这时的配置文件是:applicationContext.xml  
  181.  //里面 <bean id="aakey" value="com.zhe.Car" />哈哈,这就是所谓的Ioc依赖注入  
  182.   
  183. public class Test{  
  184.      public Car create(){  
  185.           BeanFactory f =   
  186.   new ClassPathXmlApplicationContext("applicationContext.xml");  
  187.        Object o = f.getBean("aaKey");  
  188.            Car car = (Car)o;  
  189.          car.run();  
  190.      }  
  191. }  
  192.   
  193. //-----------------------------------------------------------------  
  194. <<设计模式之禅>>-----抽象工厂  
  195.   
  196. 为什么要有抽象工厂? 所有设计模式都是为了使得代码重用,那么具体的工厂在生产过程中一定会有某些地方是一样的,那么就应该把他们提取出来,所以抽象工厂里面放的东西就是所有工厂的共性而已。。  
  197.   
  198. //这个接口规定了每个具体工厂的能力,规定了每个具体工厂要做什么事情  
  199. public interface HumanFactory{  
  200.    public Human createYellowHuman();  
  201.      
  202.    public Human createWhiteHuman();  
  203.   
  204.    public Human createBlackHuman();  
  205. }  
  206.   
  207. //下面是抽象工厂登场  
  208. public abstract class AbstractHumanFactory implements HumanFactory{  
  209.        
  210.      protected Human createHuman(HumanEnum human){ //定义了所有工厂制造人类的统一过程,他的目的其实就是为了减少代码量  
  211.             Human h = null;  
  212.            if(!human.getValue().equals("")){  
  213.                try{  
  214.                    h = (Human)Class.forName(human.getValue()).newInstance();  
  215.                }catch(Exception e){  
  216.                }  
  217.            }  
  218.         return h;  
  219.      }     
  220. }  
  221.   
  222. public class MaleHumanFactory extends AbstractHumanFactory{  
  223.        public Human createBlackHuman(){  
  224.             return super.createHuman(HumanEnum.BlackMaleHuman);  
  225.        }  
  226.        public Human createWhiteHuman(){  
  227.             return super.createHuman(HumanEnum.WhiteMaleHuman);  
  228.        }  
  229.        public Human createYellowHuman(){  
  230.             return super.createHuman(HumanEnum.YellowMaleHuman);  
  231.        }  
  232. }  
  233.   
  234. 注意:我们把枚举看成是定义的static变量也可以,只不过他的好处是 不用判断输入参数是否为空,长度为0等边界条件  
  235.   
  236. public enum HumanEnum{  
  237.    YellowMaleHuman("com.zhe.yellowHuman.YellowMaleHuman");  
  238.    YellowFemaleHuman("com.zhe.yellowHuman.YellowFemaleHuman");  
  239.   
  240.    WhiteMaleHuman("com.zhe.whiteHuman.WhitewMaleHuman");  
  241.    WhiteFemaleHuman("com.zhe.whiteHuman.WhiteFemaleHuman");  
  242.      
  243.    private String value = "";  
  244.    private HumanEnum(String value){  
  245.       this.value = value;  
  246.    }  
  247.    public String getValue(){  
  248.        return this.value;  
  249.    }  
  250. }  
  251. 转自:http://z466459262.iteye.com/blog/709059
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值