工厂模式-简单工厂,工厂方法,抽象工厂

一.简单工厂模式

抽象工厂模式为:根据用户传入参数创建不同对象

简单工厂类图:

首先,定义一个车类产品对象抽象类

public abstract class Car {

    public abstract void driver();
}

再分别定义其两个子类,一类为宝马车类,一类为奔驰车类,并实现其抽象方法driver()

public class BenzCar extends Car {

    private String brand = "Benz";

    private String color = "white";

    private String enegy = "oil";

    public void driver() {
        System.out.println("I driver the car of "+this.color+" "+this.brand+" with "+this.enegy);
    }
}
public class BMWCar extends Car {

    private String brand = "BMW";

    private String color = "red";

    private String enegy = "oil";

    public void driver() {
        System.out.println("I driver the car of "+color+" "+brand+" with "+enegy);
    }

}

在定义一个车类工厂,根据用户传入的参数(商标名称),生产不同的车类对象,返回给用户

public class CarFactory {

    public Car createCar(String brand){
        switch(brand){
            case "BMW":
                return  new BMWCar();
            case "Benz":
                return new BenzCar();
            default:
                return null;
        }
    }
}

在定义一个测试类,进行测试

public class Test {

    public static void main(String[] args) {
        CarFactory factory = new CarFactory();
        Car bmw = factory.createCar("BMW");
        bmw.driver();

        System.out.println("====================");
        Car benz = factory.createCar("Benz");
        benz.driver();
    }
}

当用户传入"BMW"生产宝马车,用户传入"Benz"生产奔驰车

简单工厂:

优点:可以根据用户的传参,来决定生产出那种对象,来满足用户接下来的业务逻辑使用

缺点:当我们每增加一种不同的产品时,就需要修改源码逻辑,不符合开闭原则

>>>>>>>>>>但可以根据反射+简单工厂,来改造简单工厂模式<<<<<<<<<<<

这样就可以,工厂生产对象时,不用修改源码了

二.工厂方法模式

工厂方法模式:为用户不需要通过传参去获取对象,而是通过new不同的对象工厂,去获取不同的对象

就是将创建对象的工厂更"细致化"

工厂方法模式类图:

首先,定义一个车类产品对象抽象类

public abstract class Car {

    public abstract void driver();
}

再分别定义其两个子类,一类为宝马车类,一类为奔驰车类,并实现其抽象方法driver()

public class BenzCar extends Car {

    private String brand = "Benz";

    private String color = "white";

    private String enegy = "oil";

    public void driver() {
        System.out.println("I driver the car of "+this.color+" "+this.brand+" with "+this.enegy);
    }
}
public class BMWCar extends Car {

    private String brand = "BMW";

    private String color = "red";

    private String enegy = "oil";

    public void driver() {
        System.out.println("I driver the car of "+color+" "+brand+" with "+enegy);
    }

}

定义一个车工厂接口

public interface ICarFactory {

    public Car createCar();

}

再分别定义两个车工厂类实现该接口

奔驰车工厂-专门生产奔驰车

public class BenzCarFactory implements  ICarFactory{
    @Override
    public Car createCar() {
        return new BenzCar();
    }
}

宝马车工厂-专门生产宝马车

public class BMWCarFactory implements ICarFactory {
    @Override
    public Car createCar() {
        return new BMWCar();
    }
}

再定义一个测试类

public class Test {

    public static void main(String[] args) {
        Car bmw = new BMWCarFactory().createCar();
        bmw.driver();

        System.out.println("====================");
        Car benz = new BenzCarFactory().createCar();
        benz.driver();
    }
}

测试结果:

工厂方法模式:

优点:

1.不需要用户传入参数,去进行不同对象的选择,而可以直接使用对应的工厂,就能生产对应的对象.

2.符合开闭原则,就是当我需要增加一个车类时,只需要扩展增加就行了,不用修改源代码

缺点:

1.需要维护的类增加了.

2.当我每增加一种车类时,不仅要增加产品类,还要增加产品工厂类,使用时也要new对应的工厂去生产对应的产品对象

三.抽象工厂模式

抽象工厂模式:多产品簇中的每系列产品,组合生产一个"新"的产品---关键词"组合"

抽象工厂类图:

定义一个车类抽象类

public abstract class Car {

    public abstract void driver();
}

定义奔驰车类-需要的能源为-"油能"

public class BenzCar extends Car {

    private String brand = "Benz";

    private String color = "white";

    private String needEnergy = "oil";

    public void driver() {
        System.out.println("I driver the car of " + this.color + " " + this.brand + " with " + this.needEnergy);
    }
}

定义宝马车类-需要能源为-"电能"

public class BMWCar extends Car {

    private String brand = "BMW";

    private String color = "red";

    private String needEnergy = "elc";

    public void driver() {
        System.out.println("I driver the car of " + color + " " + brand + " with " + needEnergy);
    }


}

定义一个能源抽象类

public abstract class Energy {

    abstract void use();

}

定义电能类

public class ElcEnergy extends Energy {

    private String energy = "elc";

    @Override
    void use() {
        System.out.println("use " + this.energy);
    }
}

定义油能类

public class OilEnergy extends Energy {

    private String energy = "oil";

    @Override
    void use() {
        System.out.println("use " + this.energy);
    }
}

定义一个抽象工厂-创建车类方法,创建能源类方法

public abstract class AbstractCarFactory {

    abstract Car createCar();

    abstract Energy createEnergy();

}

定义一个生产电能车类工厂

public class ElcCarFactory extends AbstractCarFactory {
    @Override
    Car createCar() {
        return new BMWCar();
    }

    @Override
    Energy createEnergy() {
        return new ElcEnergy();
    }

}

定义一个生产油能车类工厂

public class OilCarFactory extends AbstractCarFactory {
    @Override
    Car createCar() {
        return new BenzCar();
    }

    @Override
    Energy createEnergy() {
        return new OilEnergy();
    }
}

再定义测试类

public class Test {

    public static void main(String[] args) {
        AbstractCarFactory acf = new ElcCarFactory();
        Car car = acf.createCar();
        car.driver();
        Energy eng = acf.createEnergy();
        eng.use();
        System.out.println("======================");
        acf = new OilCarFactory();
        car = acf.createCar();
        car.driver();
        eng = acf.createEnergy();
        eng.use();
    }
}

测试结果:

当我们用电能车类工厂-创建的是,需要电能的宝马车,以及电能--这样宝马车就可以"跑"起来了

当我们用油能车类工厂-创建的是,需要油能的奔驰车,以及油能--这样奔驰车就可以"跑"起来了

抽象工厂模式:

优点:

1.为用户实现,通过不同产品簇的组合,生成不同的产品,比如 车由 品牌 颜色 能源 组合,那么我们可以抽象出 2条产品簇 品牌簇 和 能源簇 通过其不同的子类去实现 宝马电动车  奔驰油能车

2.符合开闭原则

缺点:

1.需要维护的类,过多.

2.生产出的产品,必须增加一层校验,不然油能车类工厂,如果创建出需要电能的宝马车,以及油能,那宝马车就"跑"不起来了~

抽象工厂-应用于当我们需要一系列相关类,去满足我们的业务需求时,但我们又不想维护类与类中间的关联关系时,可以采用,抽象工厂模式,去进行管理.我们只需要知道,通过油能车类工厂生产出来的,就是油能车,以及可以让油能车跑起来的油类能源(注重"组合")

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值