美文网首页
工厂方法模式

工厂方法模式

作者: senninha | 来源:发表于2017-07-13 22:47 被阅读13次
    工厂方法模式

    简单工厂模式里无法避免的是一串一串的switc判断语句,工厂方法模式在一定程度上可以解决这个问题 维基百科

    首先来一个UML图吧:

    uml图
    首先是一个要被生产的类接口,还是Car
    public interface ICar {
        public void run();
    }
    
    然后是生产Car的工厂接口
    /**
     * 工厂接口
     * @author senninha
     *
     */
    public interface IFactory {
        ICar createCar();
    }
    
    

    约定两个类实现了ICar接口,分别是MclarenCar,FerrariCar,代码就省略了

    有多少个被生产对象实现类就需要有多少个工厂方法实现类

    MclarenFactory
    /**
     * 工厂方法的实现类
     * @author senninha
     *
     */
    public class MclarenFactory implements IFactory {
    
        @Override
        public ICar createCar() {
            // TODO Auto-generated method stub
            return new CarMclaren();
        }
    
    }
    
    
    FerrariFactory
    /**
     * 工厂方法实现类
     * @author senninha
     *
     */
    public class FerrariFactory implements IFactory {
    
        @Override
        public ICar createCar() {
            // TODO Auto-generated method stub
            return new CarFerrari();
        }
    
    }
    
    测试类
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            IFactory mF = new MclarenFactory();
            ICar m = mF.createCar();
            
            IFactory fF = new FerrariFactory();
            ICar f = fF.createCar();
            
            m.run();
            f.run();
    }
    
    

    来,回顾一下以上的写法和普通的写法有什么不同
    如果是普通的写法,就是直接在Test方法里这么写:

    ICar m = new MclarenCar();
    ICar f = new FerrariCar();
    

    这个时候,如果需要更改MclarenCar类里具体的方法的实现,该怎么办?
    1.是直接修改调用的地方,药丸,如果多个地方都调用了怎么办,并且很多时候写的是工具类,给其他程序员调用的,怎么去改别人的代码?
    2.直接修改MclarenCar类,这样就违背了开放-封闭原则

    在这两者中间通过IFactory作"中介",这个时候只需要在IFactory的实现类里做文章即可.

    相关文章

      网友评论

          本文标题:工厂方法模式

          本文链接:https://www.haomeiwen.com/subject/gnighxtx.html