设计模式之工厂方法模式学习笔记

定义

定义一个用于创建对象的接口,让子类去决定是实现哪个类。工厂方法使类的实例化,延迟到了子类。

结构图

设计模式之工厂方法模式学习笔记角色拆解分析:
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,不用修改工厂类,直接去创建生成就好了。