工厂模式

主要有简单工厂模式、工厂方法模式、抽象工厂模式
先列一下,有一个汽车接口、2个具体汽车类

public interface Car {
    void getName();
}
public class AudiCar implements Car {
    
    public void getName() {
        System.out.println("我是Audi");
    }
}
public interface Car {
   public class BMWCar implements Car {

    public void getName() {
        System.out.println("我是BMW");
    }
}
}

简单工厂模式

public class SimpleFactory {

    public Car getCar(String name){
        if("BMW".equalsIgnoreCase(name)){
            return new BMWCar();
        }else if("Audi".equalsIgnoreCase(name)){
            return new AudiCar();
        }else{
            return null;
        }
    }
}

测试下

 SimpleFactory simpleFactory = new SimpleFactory();
        Car car= simpleFactory.getCar("BMW");
        car.getName();

如果你要加一忠汽车品牌,你就要修改工厂类里面的生成产品的代码,在这里你就要增加if-else判断。对于这个问题,我们的工厂方法模式就可以解决这个问题。

工厂方法模式

public interface Factory {

     Car getCar();
}
public class BMWFactory implements Factory{
    public Car getCar() {
        return new BMWCar();
    }
}
public class AudiFactory implements Factory{
    public Car getCar() {
        return new BMWCar();
    }
}

测试下

Factory factory = new AudiFactory();
		factory.getCar().getName();

无论加多少产品类,我们都不用修改原来类中的代码,而是通过增加工厂类来实现。但是这还是有缺点的,如果产品类过多,我们就要生成很多的工厂类。假如我们要实现的产品接口不止一个,也就是有多个产品接口,不同产品接口有对应的产品族。什么是产品族呢?简单的理解就是,不同牌子产的车里面会有各种颜色,如黑色、白色。不同牌子的颜色的车可以组成一个产品族。对于这种情况我们可以采用抽象工厂模式。

抽象工厂模式

public interface Car {
    void getName();

    void getColor();
}
public abstract class AudiCar implements Car {
    
    public void getName() {
        System.out.println("我是Audi");
    }
}

public abstract class BMWCar implements Car {

    public void getName() {
        System.out.println("我是BMW");
    }
}

注意:此时宝马车和奥迪车都只有名称,没有颜色

public  class BlackBMWCar extends BMWCar {
    public void getColor() {
        System.out.println("我是黑色宝马");
    }
}
public  class WhiteBMWCar extends BMWCar {
    public void getColor() {
        System.out.println("我是白色宝马");
    }
}

奥迪车也一样,此处省略

public interface Factory {

     Car createBmw();
     Car createAudi();
}
public class BlackFactory implements Factory {

    public Car createBmw() {
        return new BlackBMWCar();
    }

    public Car createAudi() {
        return new BlackAudiCar();
    }
}
public class WhiteFactory implements Factory {

    public Car createBmw() {
        return new WhiteBMWCar();
    }

    public Car createAudi() {
        return new WhiteAudiCar();
    }
}

工厂是以颜色作为区分的,一个工厂只能生产一种颜色的车(宝马和奥迪都生产)

	public static void main(String[] args) {

		Factory blackFactory =  new BlackFactory();
		Factory whiteFactory =  new WhiteFactory();
		System.out.println("生产黑色汽上生产线--------------");
		blackFactory.createAudi().getColor();
		blackFactory.createBmw().getColor();
		System.out.println("生产白色汽上生产线--------------");
		whiteFactory.createAudi().getColor();
		whiteFactory.createBmw().getColor();
		
	}

运行结果:

posted @ 2019-04-18 11:29  梅溪梦窗  阅读(108)  评论(0)    收藏  举报