设计模式之工厂模式

为了帮助更好的理解工厂模式,我们采用汽车生产的例子

1. 工厂模式

建立一个接口,通过实现类,在实现类中进行实例化产品对象。一般实现类称为Factory,从实现类中拿到新对象,就像去工厂中取货一样,我们不自己生产(new)对象,只向工厂进行申请。

2. 分类

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式(严格来说不算工厂模式,但是我觉得很像)

3. 简单工厂模式

场景1:今天我去找厂长买车,我说要买奥迪,他就造奥迪,我说要买宝马,他就造宝马。反正他厂里生产线都有。

/**
 * 汽车类接口
 * Created by wjj on 2021/1/4
 */
public interface Car {
}
/**
 * 奥迪
 * Created by wjj on 2021/1/4
 */
public class Audi implements Car{
    public Audi() {
        System.out.println("这是一辆奥迪");
   }
}
/**
 * 宝马
 * Created by wjj on 2021/1/4
 */
public class BMW implements Car {
   public  BMW(){
       System.out.println("这是一辆宝马");
   }
}
/**
 * 汽车生产厂
 * Created by wjj on 2021/1/4
 */
public class Factory {
    public static Car CreateCar(String str){
        if("BMW".equals(str)){
            /*
            根据业务场景需要,可以在这里对请求的对象pojo操作
            * */
            return new BMW();
        } else if("Audi".equals(str)){
             /*
            根据业务场景需要,可以在这里对请求的对象pojo操作
            * */
            return new Audi();
        }else
            return null;
    }
}
public class Main {
    public static void main(String[] args) {
        Factory carFac=new Factory();
        Car Audi = carFac.CreateCar("Audi");
        Car BMW = carFac.CreateCar("BMW");
    }
}
/*
这是一辆奥迪
这是一辆宝马
*/

4. 工厂方法模式

4.1. “开放-封闭”原则

对扩展开放,对修改关闭。简单来说添加新功能时,可以加代码,但是不能改以前的代码。简单工厂模式在工厂实现类内部固定了生产类型,因此不符合开闭原则。

场景2:今天我和厂长说我需要一辆奔驰,厂长说没有这个,我说一定要有,厂长说那只能把厂拆了重新加一个奔驰生产线。
显然,这样很不好。为了解决这种问题,于是就有了工厂方法模式。

4.2. 工厂方法模式

场景3:厂长把生产线都分开了,每个分厂一个生产线,按同一个模式装修。这样当有新的需求的时候,不需要动原来的厂,只要按照同一个模式再开一个新分厂就好了。

/**
 * 工厂接口
 * Created by wjj on 2021/1/4
 */
public interface Factory {
    public Car create();
}
/**
 * 奥迪生产厂
 * Created by wjj on 2021/1/4
 */
public class AudiFactory implements Factory{
    public AudiFactory() {
        System.out.println("这是奥迪车厂");
    }

    @Override
    public Car create() {
        return new Audi();
    }
}
/**
 * 奔驰厂
 * Created by wjj on 2021/1/4
 */
public class BenzFactory implements Factory{
    public BenzFactory() {
        System.out.println("这是奔驰车厂");
    }

    @Override
    public Car create() {
        return new Benz();
    }
}
/**
 * 宝马生产厂
 * Created by wjj on 2021/1/4
 */
public class BMWFactory implements Factory{
    public BMWFactory() {
        System.out.println("这是宝马车厂");
    }

    @Override
    public Car create() {
        return new BMW();
    }
}
public class Main {
    public static void main(String[] args) {
        Factory carFac1=new BenzFactory();
        Car Benz = carFac1.create();
        Factory carFac2=new AudiFactory();
        Car Audi = carFac2.create();
        Factory carFac3=new BMWFactory();
        Car BMW = carFac3.create();
    }
}
/*
这是奔驰车厂
这是一辆奔驰
这是奥迪车厂
这是一辆奥迪
这是宝马车厂
这是一辆宝马
*/

5. 抽象工厂模式

前面的工厂模式的特点在于都只有一个产品,那么如果一个厂要生产多个产品怎么处理?

场景4:今天我不光买了车,我还要自己买一个配套的备胎,厂长说我的厂没有备胎。那怎么办?和上面一样,我的工厂装修里都多一个生产备胎的生产线不就好了

/**
 * 备胎轮子接口
 * Created by wjj on 2021/1/4
 */
public interface Wheel {
}
public class AudiWheel implements Wheel{
    public AudiWheel() {
        System.out.println("这是奥迪轮子");
    }
}
public class BenzWheel implements Wheel {
    public BenzWheel() {
        System.out.println("这是奔驰轮子");
    }
}
public class BMWWheel implements Wheel{
    public BMWWheel() {
        System.out.println("这是奔驰轮子");
    }
}
public interface Factory {
    public Car createCar();
    public Wheel createWheel();
}
public class AudiFactory implements Factory {
    public AudiFactory() {
        System.out.println("这是奥迪车厂");
    }
    
    @Override
    public Car createCar() {
        return new Audi();
    }

    @Override
    public Wheel createWheel() {
        return new AudiWheel();
    }
}
public class BenzFactory implements Factory {
    public BenzFactory() {
        System.out.println("这是奔驰车厂");
    }

    @Override
    public Car createCar() {
        return new Benz();
    }

    @Override
    public Wheel createWheel() {
        return new BenzWheel();
    }
}
public class BMWFactory implements Factory {
    public BMWFactory() {
        System.out.println("这是宝马车厂");
    }

    @Override
    public Car createCar() {
        return new BMW();
    }

    @Override
    public Wheel createWheel() {
        return new BMWWheel();
    }
}
posted @ 2021-01-04 19:05  魏晋南北朝  阅读(72)  评论(0编辑  收藏  举报