工厂模式

  • 简单工厂,严格来说,简单工厂并不是一个设计模式
  • 工厂方法,管理产品等级,比如工厂只负责生产该品牌下的鼠标,或者只负责生产该品牌下的键盘
  • 抽象工厂,管理产品族,工厂会生产同一品牌的鼠标和键盘

简单工厂的实现实例

public class MouseFactory {

    /**
     * 通过传入的类型来决定具体创建DellMouse还是HpMouse
     */
    public static Mouse createMouse(int type) {
        switch (type) {
            case 0:
                return new DellMouse();
            case 1:
                return new HpMouse();
            default:
                return new DellMouse();
        }
    }

    public static void main(String[] args) {
        MouseFactory.createMouse(1).sayHi();
    }
}

>>> 我是惠普鼠标

缺点,如果需要新增一个实现类就需要修改简单工厂的代码,这违反了软件设计原则中的开闭原则

工厂方法

管理一种产品的生产(产品等级)

  • 首先有一个顶层的工厂
  • 该工厂会有几个实现工厂
  • 具体的实现工厂来生产具体的产品
// 鼠标工厂
public interface MouseFactory {

    Mouse createMouse();
}

// 惠普鼠标工厂
// 负责生产惠普鼠标
public class HpMouseFactory implements MouseFactory {

    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }
}

// 戴尔鼠标工厂
// 负责生产戴尔鼠标
public class DellMouseFactory implements MouseFactory {

    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }
}

// 测试类
public static void main(String[] args) {
    // 创建戴尔鼠标工厂
    MouseFactory factory = new DellMouseFactory();
    // 生产戴尔鼠标
    Mouse mouse = factory.createMouse();
    mouse.sayHi();
}

>>> 我是戴尔鼠标

缺点: 如果我们需要增加一种新的产品,那么需要新增一系列的类似代码,这样会导致类爆炸

抽象工厂

管理一系列产品的生产(产品族)

// 电脑工厂
public interface ComputerFactory {

    Mouse createMouse();

    Keyboard createKeyboard();
}

// 戴尔电脑工厂
public class DellComputerFactory implements ComputerFactory {

    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }

    @Override
    public Keyboard createKeyboard() {
        return new DellKeyboard();
    }
}

// 惠普电脑工厂
public class HpComputerFactory implements ComputerFactory {

    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }

    @Override
    public Keyboard createKeyboard() {
        return new HpKeyboard();
    }
}


// 测试类
public class FactoryAbstractDemo {

    public static void main(String[] args) {
        ComputerFactory hpComputer = new HpComputerFactory();
        hpComputer.createKeyboard().sayHello();
        hpComputer.createMouse().sayHi();
    }
}


>>> 我是惠普键盘
>>> 我是惠普鼠标

缺点:如果我们需要新增一个屏幕产品,那么还是需要修改所有的已存在的类,并不能实现开闭原则