工厂方法模式

工厂通常是一个用来创建其他对象的对象。工厂模式根据不同的参数来实现不同的分配方案和创建对象。
定义一个用于创建对象的接口,让子类决定实例化哪个类。

适用场景:
1.当一个类不知道它所必须创建的对象的类时
2.当一个类希望由它的子类来指定它所创建的对象时

例如用工厂来创建汽车(Car)这个对象,如果我们需要奥迪(Audi),工厂就会为我们创建一个Audi;如果我们需要奔驰(Benz),工厂就会为我们生产一个Benz。

1.普通工厂模式

Car.java

package demo.factory;

public interface Car {
    void brand();
}

Audi.java

package demo.factory;

public class Audi implements Car {
    @Override
    public void brand() {
        System.out.println("我的品牌是奥迪...");
    }
}

Benz.java

package demo.factory;

public class Benz implements Car {
    @Override
    public void brand() {
        System.out.println("我的品牌是奔驰...");
    }
}

OrdinaryFactory.java

package demo.factory;

public class OrdinaryFactory {
    public Car getCar(String brand) {
        if ("audi".equals(brand)) {
            return new Audi();
        } else if ("benz".equals(brand)) {
            return new Benz();
        } else {
            System.out.println("没有该品牌");
            return null;
        }
    }
}

Test.java

package demo.factory;

public class Test {

    @org.junit.Test
    public void testOrdinaryFactory(){
        OrdinaryFactory carFactory = new OrdinaryFactory();
        carFactory.getCar("audi").brand();
        carFactory.getCar("benz").brand();
        Car bmw = carFactory.getCar("bmw");
    }
}

运行结果如下:

我的品牌是奥迪...
我的品牌是奔驰...
没有该品牌

在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象。

2.多工厂方法模式

多工厂方法模式是提供多个工厂方法,分别创建对象,而不像上面的例子中只提供一个getCar(String brand)方法。

MultipleFactory.java

package demo.factory;

public class MultipleFactory {
    public Audi getAudi(){
        return new Audi();
    }

    public Benz getBenz(){
        return new Benz();
    }
}

Test.java

package demo.factory;

public class Test {

    @org.junit.Test
    public void testMultipleFactory(){
        MultipleFactory multipleFactory = new MultipleFactory();
        multipleFactory.getAudi().brand();
        multipleFactory.getBenz().brand();
    }
}

运行结果如下:

我的品牌是奥迪...
我的品牌是奔驰...
3.静态工厂方法模式

将上面的多工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

StaticFactory.java

package demo.factory;

public class StaticFactory {
    public static Audi getAudi(){
        return new Audi();
    }

    public static Benz getBenz(){
        return new Benz();
    }
}

Test.java

package demo.factory;

public class Test {

    @org.junit.Test
    public void testStaticFactory(){
        StaticFactory.getAudi().brand();
        StaticFactory.getBenz().brand();
    }
}

运行结果跟上面也是一样的,只不过不需要创建对象,这种方式跟好一点,也是我们优先考虑的方式。

总结
工厂方法的适用场景:多种事物(对象),具有共同的接口。

你可能感兴趣的:(工厂方法模式)