Android设计模式之抽象工厂模式

抽象工厂模式

1.定义:

为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定它们的具体类。

2.使用场景:

一个对象族有相同的约束时可以使用抽象工厂模式。咋一听,好像很抽象,举个例子帮助理解。例如,生产笔记本电脑,有很多品牌,如Hp,Dell,Lenovo等。如果仅仅生产这些品牌电脑,可以使用简单工厂模式。但是随着需求的扩展,有可能需要生产Mac,Sumsun等,此时简单工厂就需要修改大量的代码来适应,但是使用抽象工厂模式,只需要添加具体的产品类即可实现。

3.UML图

Android设计模式之抽象工厂模式_第1张图片

4.详解:

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
下面用代码举例阐述,首先是产品类接口与一些具体的实现类:

public interface Computer {
        void create();
    }

public static class HpComputer implements Computer {
        @Override
        public void create() {
            System.out.println("create a Hp computer");
        }
    }

public static class LenovoComputer implements Computer {
        @Override
        public void create() {
            System.out.println("create a Lenovo computer");
        }
    }

接着是工厂类接口与一些具体的实现类:

    public interface IFactory {
        Computer prouceComputer();
    }

    public static class HpFactory implements IFactory {
        @Override
        public Computer prouceComputer() {
            return new HpComputer();
        }
    }

public static class LenovoFactory implements IFactory {
        @Override
        public Computer prouceComputer() {
            return new LenovoComputer();
        }
    }

测试代码:

public static void main(String[] args) {
        HpFactory hpFactory = new HpFactory();
        hpFactory.prouceComputer().create();//输出结果:create a Hp computer

        LenovoFactory lenovoFactory = new LenovoFactory();
        lenovoFactory.prouceComputer().create();//输出结果:create a Lenovo computer
    }

此外,抽象工厂方法还有一种写法,而且推荐使用这种方法。在不修改上面产品接口的情况下,重写工厂类接口,如下:

public interface ComputerFactory {
         T produceComputer(Class clz);
    }

然后就是关键的工厂实现类了,代码如下:

public static class ConcreteComputerFactory implements ComputerFactory {
        @Override
        public  T produceComputer(Class clz) {
            try {
                Computer computer = (Computer) Class.forName(clz.getName()).newInstance();
                return (T) computer;
            } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
                e.printStackTrace();
                return null;
            }
        }
    }

这里用到了java的反射,相信了解java的小伙伴应该懂的,如果不懂,请自行百度。另外,如果需要生产Mac,只需要写Mac类实现Computer,然后调用这个工厂实现类,传入Mac.class即可完成生产Mac。
测试代码:

public static void main(String[] args) {
        ComputerFactory computerFactory = new ConcreteComputerFactory();
        HpComputer hpComputer = computerFactory.produceComputer(HpComputer.class);
        hpComputer.create();//输出结果:create a Hp computer
        LenovoComputer lenovoComputer = computerFactory.produceComputer(LenovoComputer.class);
        lenovoComputer.create();//输出结果:create a Lenovo computer
    }

5.代码托管地址

抽象工厂模式

你可能感兴趣的:(Android设计模式之抽象工厂模式)