浅谈简单工厂、工厂模式、抽象工厂

一:简单工厂模式

简单工厂的定义:提供一个创建对象实例的功能,而无序关心其具体实现,被创建实例的类可以是接口、抽象类也可以是具体的类。

实现汽车接口

package GOF.factory.simpleFactory;

/**
 * 公共汽车接口
 */
public interface Car {
    public String getCarName();
}

奔驰类

package GOF.factory.simpleFactory;

/**
 * 奔驰类
 */
public class BenChi implements Car {
    @Override
    public String getCarName() {
//        System.out.println("奔驰");
        return "奔驰";
    }
}

宝马类

package GOF.factory.simpleFactory;

public class BaoMa  implements Car{
    @Override
    public String getCarName() {
//        System.out.println("宝马");
        return "宝马";
    }
}

简单工厂

package GOF.factory.simpleFactory;

/**
 * 简单工厂
 * 既能生产奔驰又能生产宝马
 */
public class SimpleFactory {
    public Car getCar(String name){
        if(name.equals("BMW")){
            return new BaoMa();
        }else if (name.equals("Ben")){
            return new BenChi();
        }else {
            System.out.println("暂时无法生产!");
            return null;
        }
    }
}

测试类

package GOF.factory.simpleFactory;

public class test {
    public static void main(String[] args) {
        SimpleFactory simpleFactory = new SimpleFactory();
        Car car1 = simpleFactory.getCar("Ben");
        System.out.println(car1.getCarName());
        Car car2 = simpleFactory.getCar("BMW");
        System.out.println(car2.getCarName());
    }
}

测试结果

根据简单工厂的定义,用户只要产品而不在乎如何生产,看起来好像很完美的样子,但是大家想想,这个世界存在什么都生产的工厂吗?

显然是不存在的,每一个汽车品牌都有自己的生产工厂,都有自己的技术,映射到spring中,我们有很多很多的bean需要生产,如果单靠一个简单工厂来实现,那么我们得在工厂嵌套多少个if..else啊?

而且我们在代码中生产一辆汽车只是new一下就出来了,但是实际操作中却不知道需要多少进行操作,加载、注册等操作都将体现在工厂类中,那么这个类就会变得很紊乱,管理起来也很不方便,所以说每个品牌应该有自己的生产类。所以工厂方法出现了。

二、工厂方法

工厂接口

package GOF.factory.factoryMethod;

import GOF.factory.simpleFactory.Car;

/**
 * 定义工厂接口,功能就是生产汽车
 */
public interface Factory {
    Car getCar();
}

宝马工厂

package GOF.factory.factoryMethod;

import GOF.factory.simpleFactory.BaoMa;
import GOF.factory.simpleFactory.Car;

public class BMWFactory implements Factory {
    @Override
    public Car getCar() {
        return new BaoMa();
    }
}

奔驰工厂

package GOF.factory.factoryMethod;

import GOF.factory.simpleFactory.BenChi;
import GOF.factory.simpleFactory.Car;

public class BenzFactory implements Factory {

    @Override
    public Car getCar() {
        return new BenChi();
    }
}

测试类

package GOF.factory.factoryMethod;

public class test {
    public static void main(String[] args) {
        //宝马
        Factory factory = new BMWFactory();
        System.out.println(factory.getCar().getCarName());

        //奔驰
        Factory factory1 = new BenzFactory();
        System.out.println(factory1.getCar().getCarName());
    }
}

测试结果

根据上述代码可以看出,不同的品牌的汽车是由不同的工厂生产的,貌似又是很完美的。但是大家看一下测试类,当一个人想要去买一辆宝马汽车的时候,那么他就要找宝马工厂给他生产一辆,过几天有想要买一辆奔驰车的时候,又得跑到奔驰工厂请人生产,这无疑就增加了用户的操作复杂性。所以有没有一种方法方便用户操作呢?这个时候抽象工厂就出现了。

三、抽象工厂

猜你喜欢

转载自www.cnblogs.com/daijiabao/p/11249363.html