23种设计模式-工厂模式

29 阅读5分钟

工厂模式是一种创建型设计模式,它提供了一种方法来创建对象,而不需要在代码中显式地指定对象的具体类。在工厂模式中,我们创建一个工厂类,这个工厂类负责创建对象,并且将对象的创建过程封装起来。

工厂模式的实现

工厂模式有三种常见的实现方式:简单工厂模式工厂方法模式和抽象工厂模式。简单工厂模式是最基础的工厂模式,它将对象的创建逻辑封装在一个工厂类中,根据不同的参数来创建不同的对象。工厂方法模式则是将工厂类抽象成一个接口,每个具体的工厂类都实现这个接口来创建自己特定的对象。而抽象工厂模式则是针对产品族的创建,每个具体的工厂类可以创建一系列相关的产品。

1.简单工厂模式

简单工厂模式是工厂模式中最基础的一种实现方式,它通过一个工厂类来封装对象的创建过程,根据不同的参数返回不同的对象实例。下面是一个简单工厂模式的Java实现示例:

首先,我们定义一个抽象的产品接口,这里以图形为例:

public interface Shape {
    void draw();
}

然后,我们定义具体的产品类,这里定义两个实现类,分别是圆形和矩形:

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Draw a circle.");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Draw a rectangle.");
    }
}

接下来,我们定义一个工厂类,根据传入的参数不同来创建不同的对象:

public class ShapeFactory {
    public static Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }

        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }

        return null;
    }
}

在这个工厂类中,我们定义了一个静态方法 getShape(),根据传入的参数不同,创建不同的对象并返回。

最后,我们可以使用这个工厂类来创建对象:

public class Main {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.getShape("CIRCLE");
        circle.draw();

        Shape rectangle = ShapeFactory.getShape("RECTANGLE");
        rectangle.draw();
    }
}

2.工厂方法模式

public interface Product {
    void use();
}

public interface Factory {
    Product createProduct();
}

public class ConcreteProductA implements Product {
    @Override
    public void use() {
        System.out.println("使用产品 A");
    }
}

public class ConcreteProductB implements Product {
    @Override
    public void use() {
        System.out.println("使用产品 B");
    }
}

最后,我们定义两个具体的工厂类 ConcreteFactoryAConcreteFactoryB,它们分别负责创建产品 A 和产品 B 的对象:

public class ConcreteFactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}
最后,我们定义两个具体的工厂类 `ConcreteFactoryA``ConcreteFactoryB`,它们分别负责创建产品 A 和产品 B 的对象:
public class ConcreteFactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

这样,我们就完成了工厂方法模式的 Java 实现。下面是一个使用工厂方法模式的示例:

public class Client {
    public static void main(String[] args) {
        Factory factoryA = new ConcreteFactoryA();
        Product productA = factoryA.createProduct();
        productA.use();

        Factory factoryB = new ConcreteFactoryB();
        Product productB = factoryB.createProduct();
        productB.use();
    }
}

3.抽象工厂模式

首先,我们定义汽车和手机的抽象产品接口:

public interface Car {
    void drive();
}

public interface Phone {
    void call();
}

然后,我们定义抽象工厂接口,用于创建一组相关的产品:

public interface AbstractFactory {
    Car createCar();
    Phone createPhone();
}

接下来,我们实现两个具体工厂类:SedanFactory和SmartphoneFactory,用于创建Sedan和Smartphone族的具体产品:

public class SedanFactory implements AbstractFactory {
    @Override
    public Car createCar() {
        return new Sedan();
    }

    @Override
    public Phone createPhone() {
        return new OldPhone();
    }
}

public class SmartphoneFactory implements AbstractFactory {
    @Override
    public Car createCar() {
        return new SUV();
    }

    @Override
    public Phone createPhone() {
        return new Smartphone();
    }
}

最后,我们实现四个具体产品类:Sedan、SUV、Smartphone和OldPhone:

public class Sedan implements Car {
    @Override
    public void drive() {
        System.out.println("Driving Sedan");
    }
}

public class SUV implements Car {
    @Override
    public void drive() {
        System.out.println("Driving SUV");
    }
}

public class Smartphone implements Phone {
    @Override
    public void call() {
        System.out.println("Making a call with Smartphone");
    }
}

public class OldPhone implements Phone {
    @Override
    public void call() {
        System.out.println("Making a call with Old Phone");
    }
}

现在,我们可以使用抽象工厂模式创建不同族的产品:

public class Client {
    public static void main(String[] args) {
        AbstractFactory sedanFactory = new SedanFactory();
        Car sedan = sedanFactory.createCar();
        sedan.drive();
        Phone oldPhone = sedanFactory.createPhone();
        oldPhone.call();

        AbstractFactory smartphoneFactory = new SmartphoneFactory();
        Car suv = smartphoneFactory.createCar();
        suv.drive();
        Phone smartphone = smartphoneFactory.createPhone();
        smartphone.call();
    }
}

模式名称描述优点缺点
简单工厂模式通过一个工厂类创建不同类型的对象,客户端不需要知道具体实现类简单易懂,能够有效降低代码耦合度,适合创建简单对象不利于扩展,增加新产品需要修改工厂类的代码,违反了开放封闭原则
工厂方法模式定义一个创建对象的接口,但由子类决定要实例化的类是哪一个,客户端只需知道创建产品的工厂即可有良好的扩展性,支持增加新产品的同时,不会修改原有代码类的数量较多,增加了代码复杂度
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类能够有效降低代码耦合度,支持多种产品族的创建增加新产品族需要修改抽象工厂和所有具体工厂的代码,违反了开放封闭原则,增加了系统的抽象性和理解难度

总的来说,工厂模式是一种非常有用的设计模式,可以提高代码的可读性、可维护性和灵活性。如果你正在编写一个需要大量创建对象的程序,那么工厂模式是一个值得考虑的选择。