工厂模式是一种创建型设计模式,其目的是提供一种创建对象的方式,将对象的创建和使用分离开来,从而降低系统的耦合度。
在工厂模式中,定义一个抽象工厂接口,该接口包含了一组用于创建对象的方法。具体的工厂类实现该接口,并根据不同的参数返回不同类型的对象。

一、简单工厂模式

简单工厂模式(Simple Factory Pattern)又称为静态工厂方法模式,它是工厂模式的一种变体。
在简单工厂模式中,一个工厂类负责创建多个不同类型的产品,根据传入的参数返回不同类型的产品实例。
简单工厂模式虽然比较简单,但它的缺点是当需要增加新的产品时,需要修改工厂类的代码,违反了开闭原则,不利于系统的扩展和维护。

//1.抽象产品类——手机
public interface Phone {
    //打电话方法
    void call();
}
//2.具体产品类——华为手机
public class HuaWeiPhone implements Phone {
    @Override
    public void call() {
        System.out.println("使用华为手机打电话...");
    }
}
//3.具体产品类——小米手机
public class XiaoMiPhone implements Phone{
    @Override
    public void call() {
        System.out.println("使用小米手机打电话...");
    }
}
///4.简单工厂类——手机工厂
public class PhoneFactory {
    /**
     * 根据类型返回手机对象
     * @param type
     * @return
     */
    public static Phone createPhone(String type) {
        if (type.equals("HuaWei")) {
            return new HuaWeiPhone();
        } else if (type.equals("XiaoMi")) {
            return new XiaoMiPhone();
        } else {
            throw new IllegalArgumentException("输入的手机类型不存在:" + type);
        }
    }

    public static void main(String[] args) {
        PhoneFactory.createPhone("HuaWei").call();
        PhoneFactory.createPhone("PingGuo").call();
    }
}

二、抽象工厂模式

抽象工厂模式是一种创建型设计模式,它允许客户端通过一个抽象接口来创建一组相关或者相互依赖的对象,而不需要指定具体实现类。抽象工厂模式与工厂方法模式类似,都是工厂模式的变体,不同之处在于抽象工厂模式可以创建一组产品,而工厂方法模式只能创建单一的产品。

抽象工厂模式包含以下角色:

  • 抽象工厂类(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,通常由一个抽象类或者接口实现。
  • 具体工厂类(Concrete Factory):实现抽象工厂类中的抽象方法,返回一组具体产品的实例。
  • 抽象产品类(Abstract Product):定义了一组产品的接口。
  • 具体产品类(Concrete Product):实现抽象产品类的接口,由具体工厂类创建。
//1.抽象产品类——电脑
public interface Computer {
    void use();
}
//2.抽象工厂类——电脑工厂
public interface ComputerFactory {
    Computer createDesktop();

    Computer createLaptop();
}
//3.具体产品类——台式机
public class Desktop implements Computer {
    private String name;

    public Desktop(String name) {
        this.name = name;
    }

    @Override
    public void use() {
        System.out.println("使用" + name + "台式机");
    }
}
//4.具体产品类——笔记本电脑
public class Laptop implements Computer {
    private String name;

    public Laptop(String name) {
        this.name = name;
    }

    @Override
    public void use() {
        System.out.println("使用" + name + "笔记本电脑");
    }
}
//5.具体工厂类——戴尔工厂
public class DellFactory implements ComputerFactory{
    @Override
    public Computer createDesktop() {
        return new Desktop("戴尔");
    }

    @Override
    public Computer createLaptop() {
        return new Laptop("戴尔");
    }
}
//6.具体工厂类——惠普工厂
public class HPFactory implements ComputerFactory {
    @Override
    public Computer createDesktop() {
        return new Desktop("惠普");
    }

    @Override
    public Computer createLaptop() {
        return new Laptop("惠普");
    }
}
//7.测试方法
    public static void main(String[] args) {
        // 创建戴尔工厂
        ComputerFactory dellFactory = new DellFactory();

        // 创建戴尔台式机
        Computer dellDesktop = dellFactory.createDesktop();
        dellDesktop.use(); // 输出:使用台式机

        // 创建戴尔笔记本电脑
        Computer dellLaptop = dellFactory.createLaptop();
        dellLaptop.use(); // 输出:使用笔记本电脑

        // 创建惠普工厂
        ComputerFactory hpFactory = new HPFactory();

        // 创建惠普台式机
        Computer hpDesktop = hpFactory.createDesktop();
        hpDesktop.use(); // 输出:使用台式机

        // 创建惠普笔记本电脑
        Computer hpLaptop = hpFactory.createLaptop();
        hpLaptop.use(); // 输出:使用笔记本电脑
    }