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

一:简单工厂模式

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

实现汽车接口

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());
    }
}

测试结果

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

三、抽象工厂

 抽象工厂

public abstract class AbstractFactory {

     protected abstract Car getCar();
     
     //这段代码就是动态配置的功能
     //固定模式的委派
     public Car getCar(String name){
        if("BMW".equalsIgnoreCase(name)){
            return new BmwFactory().getCar();
        }else if("Benz".equalsIgnoreCase(name)){
            return new BenzFactory().getCar();
        }else if("Audi".equalsIgnoreCase(name)){
            return new AudiFactory().getCar();
        }else{
            System.out.println("这个产品产不出来");
            return null;
        }
    }
}

 

默认工厂

public class DefaultFactory extends AbstractFactory {

    private AudiFactory defaultFactory = new AudiFactory();
    
    public Car getCar() {
        return defaultFactory.getCar();
    }

}

 

宝马工厂

public class BMWFactory extends AbstractFactory {
    @Override
    public Car getCar() {
        return new BMW();
    }
}

 

奔驰工厂

public class BenzFactory extends AbstractFactory {
    @Override
    public Car getCar() {
        return new Benz();
    }
}

 

测试类

public class AbstractFactoryTest {
    public static void main(String[] args) {        
        DefaultFactory factory = new DefaultFactory();  
        System.out.println(factory.getCar("Benz").getName());            
    }
}

 

测试结果

Benz

根据上述代码可以看出,用户需要一辆汽车,只需要去找默认的工厂提出自己的需求(传入参数),便能得到自己想要产品,而不用根据产品去寻找不同的生产工厂,方便用户操作。

 

posted @ 2019-07-26 11:50  D_戴同学  阅读(354)  评论(1编辑  收藏  举报