zoukankan      html  css  js  c++  java
  • Android设计模式之工厂模式

    定义

    工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例 对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩 展性和尽量少的修改量。

    个人理解:工厂模式就等于生产产品,工厂模式实例化对象,当你需要实例化一个对象,你发现不止一个选择(所有供选择的类都实现了同一个接口)的时候,针对这一情况写一个通用的方法(方法返回类型是那个共用的接口),这就是工厂模式了。

    案例讲解:以两个工厂造车类和所有工厂操作类来实现工厂模式

    宝马类

    public class Bmw implements Volkswagen {
        
         public static final int ID = 1;
        @Override
        public void drive() {
            // TODO Auto-generated method stub
            System.out.println("宝马造车成功啦");  
        }
    
        @Override
        public String getName() {
            // TODO Auto-generated method stub
            return "宝马";
        }
    
    }

    奔驰类

    public class Benz implements Volkswagen {
        public static final int ID = 0;
        
        @Override
        public void drive() {
            // TODO Auto-generated method stub
            System.out.println("奔驰造车成功了");  
    
        }
    
        @Override
        public String getName() {
            // TODO Auto-generated method stub
            return "奔驰";
        }
    
    }

    Volkswagen.Java

    /***
     * 产品操作
     * @author zq
     *
     */
    public interface Volkswagen {
    
        void drive();
        
        String getName();
    }

    工厂类

    /***
     * 工厂类
     * @author zq
     *
     */
    public class VehicleVolkswagenFactory {
        
        
        public Volkswagen createVolkswagen(int id)
        {
            Volkswagen volkswagen=null;
            switch (id) {
            case Benz.ID:
                volkswagen=new Benz();
                break;
            case Bmw.ID:
                volkswagen=new Bmw();
                break;
    
            default:
                break;
            }
            return volkswagen;
        }
           //反射得到
        public Volkswagen createVolkswagen(Class <? extends Volkswagen> clazz){
            Volkswagen volkswagen = null;
            try {
                volkswagen = clazz.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return volkswagen;
        }
    
    }

    Activity.Java

    public class VehicleActivity extends Activity
    {
        TextView tv_benz,tv_bmx;
            VehicleVolkswagenFactory factory;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.vehicle_activity);
            factory = new VehicleVolkswagenFactory();
            initViewBenz();
            initViewBmw();
        }
        private void initViewBenz() {
            // TODO Auto-generated method stub
             tv_benz=(TextView) findViewById(R.id.tv_benz);
             Volkswagen volkswagen=factory.createVolkswagen(Benz.ID);
             tv_benz.setText(volkswagen.getName());
             volkswagen.drive();//工厂相关方法
            
        }
        private void initViewBmw() {
            // TODO Auto-generated method stub
            tv_bmx=(TextView) findViewById(R.id.tv_bmx);
            Volkswagen volkswagen=factory.createVolkswagen(Bmw.class);
            tv_bmx.setText("反射得到"+volkswagen.getName());
            
        }
        
    }

    优点
    工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定 的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而 不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。


    缺点
    由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
    当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

  • 相关阅读:
    bzoj 4012: [HNOI2015]开店
    POJ 1054 The Troublesome Frog
    POJ 3171 Cleaning Shifts
    POJ 3411 Paid Roads
    POJ 3045 Cow Acrobats
    POJ 1742 Coins
    POJ 3181 Dollar Dayz
    POJ 3040 Allowance
    POJ 3666 Making the Grade
    洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P
  • 原文地址:https://www.cnblogs.com/zhangqie/p/6411686.html
Copyright © 2011-2022 走看看