xSong'blog

4设计模式之工厂方法模式

2020-02-28
阅读量

工厂方法模式 Factory Pattern

  • 定义:定义一个用于创建对象的接口,让子类决定实例化哪个类;
  • 主要解决:主要解决接口选择的问题。
  • 使用场景:需要生成复杂对象的地方。
  • 如何使用:将创建过程在其子类执行。
  • 生活例子:汽车工厂、快餐工厂。
  • Android中的例子:LinearLayout设置根部局View的onCreate;数据库存储方式的选择;
  • 注意事项:复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

优点(工厂方法)

  1. 一个调用者想创建一个对象,只要知道其名称就可以了。
  2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  3. 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。


简单工厂

简单工厂也是工厂模式的其中一种, 就是一个工厂类,一个产品抽象类。意思是:一个鼠标工厂,可以生产多个牌子的鼠标。

简单工厂.jpg

// 创建一个接口
public abstract class Mouse {
    public abstract void sayHi();
}
// 创建实现接口的实体类
public class DellMouse extends Mouse {
    @Override
    public void sayHi() {
        System.out.println("DellMouse - sayHi");
    }
}
public class HpMouse extends Mouse {
    @Override
    public void sayHi() {
        System.out.println("HpMouse - sayHi");
    }
}
public class MouseFactory {
    public Mouse createMouse(int i) {
        switch (i) {
            case 0:
                return new DellMouse();
            case 1:
                return new HpMouse();
        }
        return null;
    }
}
public class client {
    public static void main(String[] args) {
        MouseFactory mouseFactory = new MouseFactory();
        Mouse m = mouseFactory.createMouse(0);
        m.sayHi();
    }
}

输出结果: DellMouse - sayHi

另一种写法:反射

// 创建一个工厂,加上反射的方式
public class MouseFactory {
    public <T extends Mouse> T createMouse(Class<T> mcls) {
        Mouse mouse = null;
        try {
            mouse = (Mouse) Class.forName(mcls.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) mouse;
    }
}
// 客户点使用该工厂
public class client {
    public static void main(String[] args) {
        MouseFactory mouseFactory = new MouseFactory();
        Mouse m = mouseFactory.createMouse(HpMouse.class);
        m.sayHi();
    }
}

工厂方法

工厂方法:有多个工厂类,一个产品抽象类。一个惠普鼠标工厂,可以生产多种鼠标。一个戴尔鼠标工厂,也可以生产多种鼠标。

工厂模式.jpg

// 省略 Mouse 、DellMouse、HpMouse 的代码
public abstract class MouseFactory {
    public abstract Mouse createMouse();
}
public class DellMouseFactory extends MouseFactory {
    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }
}
public class HPMouseFarctrory extends MouseFactory {
    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }
}
public class client {
    public static void main(String[] args) {
        HPMouseFarctrory hpf = new HPMouseFarctrory();
        Mouse mouse = hpf.createMouse();
        mouse.sayHi();
    }
}

Similar Posts

Comments