设计模式 在线

2233工厂模式

在jdk9中直接使用泛型的newInstance方法已经过时。重写的getClass()方法如下:

public <T> T getClass(Class<? extends T> clazz) {
    T obj = null;
    try {
        obj = clazz.getDeclaredConstructor().newInstance();
    } 
        catch (ReflectiveOperationException e) {
        e.printStackTrace();  
    }
    return obj;
}

2232工厂模式

在上面的基础上进一步扩展,针对多个接口实现一个公共的工厂类:

public class ObjectFactory {
    public <T> Object getObject(Class<T> clazz) {
       if (clazz == null ) {
           return null;
    }    
        Object obj  = null;
        try {
            obj = Class.forName(clazz.getName()).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return obj;
    }
}

2231工厂模式

public class ShapeFactory {
    public static <T> T getClass(Class<? extends T> clazz) {
        T obj = null;

        try {
            obj = (T) Class.forName(clazz.getName()).newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return obj;
    }
}

省略类型强制转换,支持多态

Rectangle rect = ShapeFactory.getClass(Rectangle.class);
rect.draw();

Shape square = ShapeFactory.getClass(Square.class);
square.draw();

2230工厂模式

使用反射机制可以解决每次增加一个产品时,都需要增加一个对象实现工厂的缺点

public class ShapeFactory {
    public static Object getClass(Class<?extends Shape> clazz) {
        Object obj = null;

        try {
            obj = Class.forName(clazz.getName()).newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return obj;
    }
}

使用的使用采用强制转换

Rectangle rect = (Rectangle) ShapeFactory.getClass(Rectangle.class);
rect.draw();
Square square = (Square) ShapeFactory.getClass(Square.class);
square.draw();

这样就只需要一个对象实现工厂

2229设计模式简介

开闭原则:实现热插拔,提高扩展性。

里氏代换原则:实现抽象的规范,实现子父类互相替换;

依赖倒转原则:针对接口编程,实现开闭原则的基础;

接口隔离原则:降低耦合度,接口单独设计,互相隔离;

迪米特法则,又称不知道原则:功能模块尽量独立;

合成复用原则:尽量使用聚合,组合,而不是继承;