工厂模式

1、普通工厂模式

        工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

        在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

        优点:

        1、一个调用者想创建一个对象,只要知道其名称就可以了。

        2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

        3、屏蔽产品的具体实现,调用者只关心产品的接口。

        缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

使用场景

1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。

2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。

普通工厂模式实现步骤

1.创建接口和创建实现这个接口的实体类。

2.创建一个工厂,可以基于给定信息生成实体类的对象。

创建一个接口:

public interface Car {
    void build();
}

创建实现接口的实体类:

Audi.java

public class Audi implements Car{
    @Override
    public void build() {
        System.out.println("This is a Audi car!");
    }
}

Benz.java

public class Benz implements Car{
    @Override
    public void build() {
        System.out.println("This is a Benz car!");
    }
}

创建一个工厂,生成基于给定信息的实体类的对象。

public class CarFactory {
    public Car getCar(String carName){
        if(carName == null){
            return null;
        }
        if (carName.equalsIgnoreCase("Audi")){
            return new Audi();
        }else if (carName.equalsIgnoreCase("Benz")){
            return new Benz();
        }
        return null;
    }
}

使用该工厂,通过传递信息来获取实体类的对象。

public class CarDemo {
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        Car audi = carFactory.getCar("Audi");
        audi.build();//This is a Audi car!
    }
}

2、抽象工厂模式

通过一个超级工厂创建其他工厂。在抽象工厂模式中,不需要指定产出产品工厂的类。每个生成的工厂按照工厂模式提供对象。

实现步骤

1.创建 Car和 Motorcycle 接口和实现这些接口的实体类。

2.创建抽象工厂类 AbstractFactory。

3.定义工厂类 CarFactory 和 MotorFactory,这两个工厂类都是扩展了 AbstractFactory。

4.创建一个工厂创造器/生成器类 FactoryProducer。

代码

为汽车创建一个接口

public interface Car {
    void build();
}

创建实现汽车接口的实体类 Audi.java

public class Audi implements Car{
    @Override
    public void build() {
        System.out.println("This is a Audi car!");
    }
}

Benz.java

public class Benz implements Car{
    @Override
    public void build() {
        System.out.println("This is a Benz car!");
    }
}

为摩托车创建一个接口

public interface Motorcycle {
    void makeMotorcycle();
}

创建实现摩托车接口的实体类 Honda.java

public class Honda implements Motorcycle {
    @Override
    public void makeMotorcycle() {
        System.out.println("造一个本田摩托");
    }
}

创建实现摩托接口的实体类 Spring.java。

public class Spring implements Motorcycle {
    @Override
    public void makeMotorcycle() {
        System.out.println("造一个春风摩托");
    }
}

为Car和Color对象创建抽象类获取工厂。

public abstract class AbstracFactory {
    public abstract Motorcycle getMotor(String color);
    public abstract Car getCar(String car);
}

创建Motor工厂类集成工厂抽象类。基于给定的信息生成实体类对象。

public class MotorFactory extends AbstracFactory{

    @Override
    public Motorcycle getMotor(String color) {
        if (color == null){
            return null;
        }
        if (color.equalsIgnoreCase("Spring")){
            return new Spring();
        }else if (color.equalsIgnoreCase("Honda")){
            return new Honda();
        }
        return null;
    }

    @Override
    public Car getCar(String car) {
        return null;
    }
}

创建car工厂类集成工厂抽象类。基于给定的信息生成实体类对象。

public class CarFactory extends AbstracFactory{
    @Override
    public Motorcycle getMotor(String color) {
        return null;
    }
    @Override
    public Car getCar(String carName){
        if(carName == null){
            return null;
        }
        if (carName.equalsIgnoreCase("Audi")){
            return new Audi();
        }else if (carName.equalsIgnoreCase("Benz")){
            return new Benz();
        }
        return null;
    }
}

创建一个工厂创造类,通过给定条件获取工厂。

public class FactoryProducer {
    public static AbstracFactory getFactory(String choice){
        if (choice.equalsIgnoreCase("Car")){
            return new CarFactory();
        }else if (choice.equalsIgnoreCase("Motor")){
            return new MotorFactory();
        }
        return null;
    }
}

使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象。

public class AbstractFactoryPatternDemo {
    public static void main(String[] args) {
        AbstracFactory motorFactory = FactoryProducer.getFactory("Motor");
        Motorcycle motor = motorFactory.getMotor("Spring");
        motor.makeMotorcycle();//造一个春风摩托
        AbstracFactory carFactory = FactoryProducer.getFactory("CAR");
        Car audi = carFactory.getCar("Audi");//This is a Audi car!
        audi.build();
    }
}

若要增加新的产品,只需要在AbstracFactory中增加创建产品的接口,并在具体工厂中实现新加产品的创建。