工厂模式

作者: 小阿拉 | 来源:发表于2017-12-22 21:11 被阅读0次

    怕是时间一久又搞混了简单工厂模式、工厂方法模式和抽象工厂模式,还是输出一下吧。这几种模式说简单,倒是真的不难,就是自己怎么运用到平日项目中去,这点让我很是头疼 。这篇文章我不会很细致地代码UML图相结合来介绍这几种模式,如果是小白,可以看这位四月葡萄
    写的Android的设计模式,可以说是很友好全面了,今天我主要就啰嗦两句我觉得重要的点,以便以后一看就记起。

    (一)简单工厂模式

    优点是代码解耦,创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建。

    简单工厂模式有一个最大的问题——如果现在接口的子类增加了,那么工厂类肯定需要修改,这样违反了开闭原则(OCP)。因此可以使用反射来创建实例对象。

    packagecn.mldn.demo;
    interface Fruit {
        public void eat() ;
    }
    
    class Apple implements Fruit {
        public void eat() {
            System.out.println("吃苹果。");
        };
    }
    
    class Orange implements Fruit {
        public void eat() {
            System.out.println("吃橘子。");
        };
    }
    
    class Factory {
    
        public static <T extends Fruit> T create(Class<T> clz) {
            Fruit f = null;
            try{
                //看这儿看这儿~反射出实例
                f = (Fruit) Class.forName(clz.getName()).newInstance() ;
            } catch(Exception e) {
                e.printStackTrace();
            }
            return (T)f ;
        }
    }
    
    public class FactoryDemo {
        public static void main(String[] args) {
            //调用方式
            Factory.create(Orange.class).eat();
            Factory.create(Apple.class).eat();
        }
    }
    

    利用反射后即使增加了接口的子类,工厂类照样可以完成对象的实例化操作,这个才是真正的工厂类,可以应对于所有的变化。但用反射的话,性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。且不安全,通过反射机制我们能拿到类的私有成员

    以前我对简单工厂模式很有偏见,因为觉得它违反开闭原则的缺点实在是太明显了。而在实际项目中我也会写出缺点很明显的代码,很气,但就是不知道怎么改进。或许我之前这么鄙视简单工厂模式,其实是在鄙视写臭臭代码的自己呀。只能多学习多思考了。而且简单工厂模式确实是有其优点之处的呀,创建实例的工作与使用实例的工作分开~
    参考:Java的反射机制

    (二)工厂方法模式

    没什么值得说的,拷贝一个UML图出来好了。工厂方法模式每个工厂只能创建一种类型的产品。

    工厂方法模式UML类图 工厂方法模式有抽象工厂类,简单工厂模式没有抽象工厂类且其工厂类的工厂方法是静态的

    (三)抽象工厂模式

    抽象工厂模式UML

    其实大家看看这图,很容易可以看出来如果增加新的产品,抽象工厂模式需要修改抽象工厂和所有的具体工厂,也违反了开闭原则。这就是抽象工厂模式的缺点了。

    对比一下工厂方法模式和抽象工厂模式——

    在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性。抽象工厂模式则可以能够创建多种类型的产品,应用场景为生产多个产品组合的对象。抽象工厂模式代码解耦,创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建。

    温故知新。工厂模式的初衷是解耦解耦解耦,创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建。

    参考:
    Android 设计模式之各种工厂方法模式

    相关文章

      网友评论

        本文标题:工厂模式

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