zoukankan      html  css  js  c++  java
  • 工厂方法和new

    有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

    典型应用

           要说明工厂模式的优点,可能没有比组装汽车更合适的例子了。场景是这样的:汽车由发动机、轮、底盘组成,现在需要组装一辆车交给调用者。假如不使用工厂模式,代码如下:

    [java] view plain copy
     
    1. class Engine {  
    2.     public void getStyle(){  
    3.         System.out.println("这是汽车的发动机");  
    4.     }  
    5. }  
    6. class Underpan {  
    7.     public void getStyle(){  
    8.         System.out.println("这是汽车的底盘");  
    9.     }  
    10. }  
    11. class Wheel {  
    12.     public void getStyle(){  
    13.         System.out.println("这是汽车的轮胎");  
    14.     }  
    15. }  
    16. public class Client {  
    17.     public static void main(String[] args) {  
    18.         Engine engine = new Engine();  
    19.         Underpan underpan = new Underpan();  
    20.         Wheel wheel = new Wheel();  
    21.         ICar car = new Car(underpan, wheel, engine);  
    22.         car.show();  
    23.     }  
    24. }  


            可以看到,调用者为了组装汽车还需要另外实例化发动机、底盘和轮胎,而这些汽车的组件是与调用者无关的,严重违反了迪米特法则耦合度太高。并且非常不利于扩展。另外,本例中发动机、底盘和轮胎还是比较具体的,在实际应用中,可能这些产品的组件也都是抽象的,调用者根本不知道怎样组装产品。假如使用工厂方法的话,整个架构就显得清晰了许多。

    [java] view plain copy
     
    1. interface IFactory {  
    2.     public ICar createCar();  
    3. }  
    4. class Factory implements IFactory {  
    5.     public ICar createCar() {  
    6.         Engine engine = new Engine();  
    7.         Underpan underpan = new Underpan();  
    8.         Wheel wheel = new Wheel();  
    9.         ICar car = new Car(underpan, wheel, engine);  
    10.         return car;  
    11.     }  
    12. }  
    13. public class Client {  
    14.     public static void main(String[] args) {  
    15.         IFactory factory = new Factory();  
    16.         ICar car = factory.createCar();  
    17.         car.show();  
    18.     }  
    19. }  

            使用工厂方法后,调用端的耦合度大大降低了。并且对于工厂来说,是可以扩展的,以后如果想组装其他的汽车,只需要再增加一个工厂类的实现就可以。无论是灵活性还是稳定性都得到了极大的提高。

  • 相关阅读:
    switch的使用
    ArrayAdapter的使用
    android的xml中怎么实现按钮按下去变颜色
    Intent跳转的设置和Bundle的使用
    监听JList列表项的单击事件
    草稿
    Android背景图覆盖状态栏(我的手机安卓版本是4.2.2)
    RSA加密解密 (输入数值)
    仿射密码加密解密 (输入字母数值)
    Intent.ACTION_PICK
  • 原文地址:https://www.cnblogs.com/lnas01/p/5358540.html
Copyright © 2011-2022 走看看