工厂方法模式 Factory Pattern
- 定义:定义一个用于创建对象的接口,让子类决定实例化哪个类;
- 主要解决:主要解决接口选择的问题。
- 使用场景:需要生成复杂对象的地方。
- 如何使用:将创建过程在其子类执行。
- 生活例子:汽车工厂、快餐工厂。
- Android中的例子:LinearLayout设置根部局View的onCreate;数据库存储方式的选择;
- 注意事项:复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
优点(工厂方法)
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
简单工厂
简单工厂.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();
}
}
网友评论