设计模式之工厂方法模式学习笔记
定义
定义一个用于创建对象的接口,让子类去决定是实现哪个类。工厂方法使类的实例化,延迟到了子类。
结构图
角色拆解分析:
1.Product:抽象产品类
2.ConcrereProduct:具体产品类,实现Product接口
3.Factory:抽象工厂类,返回Product类型对象
4.ConcreteFactory:具体工程类,返回ConcreteProduct实例
工厂方法模式实现
1.抽象产品类ProductX(父类)
public abstract class Computer{
//产品的抽象方法
public abstract void start();
}
2.具体产品类Product
//美帝良心想
public class LenovoComputer extends Computer {
@Override
public void start() {
System.out.print("美帝良心想启动了");
}
}
3.抽象工厂Factory
public abstract class ComputerFactory {
public abstract <T extends Computer> T createComputer(Class<T> clz);//创建电脑方法
}
4.具体工厂
富土康是一个具体工厂,继承抽象工厂,通过反射来计算不同厂家的计算机
public class FoxconnFactory extends ComputerFactory {
@Override
public <T extends Computer> T createComputer(Class<T> clz) {
Computer computer = null;
String name = clz.getName();
try {
//反射来生成不同厂家的计算机
computer = (Computer)Class.forName(name).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return (T) computer;
}
}
5.客户端调用
客户端创建具体工厂对象,来生成美帝良心想、铁板熊掌普…
public class UserClient {
public static void main(String [] args){
ComputerFactory computerFactory = new FoxconnFactory();
//生成美帝良心想
LenovoComputer lenovoComputer = computerFactory.createComputer(LenovoComputer.class);
lenovoComputer.start();
//生成铁板熊掌普
HpComputer hpComputer = computerFactory.createComputer(HpComputer.class);
hpComputer.start();
}
}
对比简单工厂
简单工厂模式的工厂类中都包含了必要的逻辑判断,根据不同的条件来动态的实例化相关的类。站在用户的角度,这去除了与具体产品的依赖。但是也有弊端,如果我要生成Mac笔记本,就要在工厂类增加case分类,违背了开放封闭原则。
而工厂模式就没有违背开放封闭原则,我想生成Mac,不用修改工厂类,直接去创建生成就好了。