工厂模式

工厂模式(Factory):指将创建对象的过程交给特定的类来进行管理,对创建实例进行了封装。工厂模式包括工厂方法模式和抽象工厂模式,而简单工厂模式并未列入23中设计模式中。

  • 简单工厂模式
//车标的枚举
public enum Logo {
    PORSCHE, MASERATI
}

public interface Car {
    //汽车move
    void move();
}

public class PorscheCar implements Car {
    @Override
    public void move() {
        System.out.println("保时捷飞驰而过");
    }
}

public class MaseratiCar implements Car {
    @Override
    public void move() {
        System.out.println("玛莎拉蒂紧随其后");
    }
}

public class CarFactory {
    public Car create(Logo logo){
        //根据车标的枚举类来创建对应的实例
        switch (logo.ordinal()){
            case 0:
                System.out.println("生产了一辆保时捷");
                return new PorscheCar();
            case 1:
                System.out.println("生产了一辆玛莎拉蒂");
                return new MaseratiCar();
            default:
                System.out.println("未找到车型!");
                return null;
        }
    }

    //单例模式构建工厂, 保证工厂不会被创建很多的实例
    private CarFactory() {}

    public static CarFactory getInstance(){
        return CarFactoryHolder.INSTANCE;
    }

    private static class CarFactoryHolder {
        public static final CarFactory INSTANCE = new CarFactory();
    }
}

//测试Demo
public class Main {
    public static void main(String[] args) {
        Car c1 = CarFactory.getInstance().create(Logo.PORSCHE);
        Car c2 = CarFactory.getInstance().create(Logo.MASERATI);
        c1.move();
        c2.move();

        /**
         * console:
         * 生产了一辆保时捷
         * 生产了一辆玛莎拉蒂
         * 保时捷飞驰而过
         * 玛莎拉蒂紧随其后
         */
    }
}

简单工厂模式的UML图:

该模式是构建一种具体的工厂(CarFactory),将产品的创建交给工厂实现,但是每次新增一种产品,都需要对CarFactory进行修改,可扩展性不是很好。

 

  • 工厂方法模式
public interface Car {
    //汽车move
    void move();
}

public class PorscheCar implements Car {
    @Override
    public void move() {
        System.out.println("保时捷飞驰而过");
    }
}

public class MaseratiCar implements Car {
    @Override
    public void move() {
        System.out.println("玛莎拉蒂紧随其后");
    }
}

//抽象出生产汽车的方法
public interface BaseCarFactory {
    Car create();
}

//保时捷的独有的工厂, 这个工产只生产保时捷
public class PorscheCarFactory implements BaseCarFactory {
    @Override
    public Car create() {
        System.out.println("生产了一辆保时捷");
        return new PorscheCar();
    }

    //单例
    private PorscheCarFactory() {}

    public static PorscheCarFactory getInstance(){
        return PorscheCarFactoryHolder.INSTANCE;
    }

    private static class PorscheCarFactoryHolder {
        public static final PorscheCarFactory INSTANCE = new PorscheCarFactory();
    }
}

//玛莎拉蒂的独有的工厂, 这个工产只生产玛莎拉蒂
public class MaseratiCarFactory implements BaseCarFactory {
    @Override
    public Car create() {
        System.out.println("生产了一辆玛莎拉蒂");
        return new MaseratiCar();
    }

    //单例
    private MaseratiCarFactory() {}

    public static MaseratiCarFactory getInstance(){
        return MaseratiCarFactoryHolder.INSTANCE;
    }

    private static class MaseratiCarFactoryHolder {
        public static final MaseratiCarFactory INSTANCE = new MaseratiCarFactory();
    }
}

//测试Demo
public class Main {
    public static void main(String[] args) {
        Car porsche = PorscheCarFactory.getInstance().create();
        Car maserati = MaseratiCarFactory.getInstance().create();
        porsche.move();
        maserati.move();

        /**
         * console:
         * 生产了一辆保时捷
         * 生产了一辆玛莎拉蒂
         * 保时捷飞驰而过
         * 玛莎拉蒂紧随其后
         */
    }
}

工厂方法模式的UML图:

该模式是构建一种抽象工厂(BaseCarFactory),一种抽象产品(Car),将具体对象的创建交给具体的工厂,每个工厂只负责生产指定类型的产品,当新增一种新产品时,例如生产宝马,那么只需要构建宝马的生产工厂即可,原来代码无需变动,具有一定的可扩展性。但工厂方法模式也有局限性,即所添加的产品是一个系列的,此处范例则都要是Car;若需要新增一个产品Plane,使用工厂方法则需要再复制一份上面的代码出来,专门处理Plane。

 

  • 抽象工厂模式
//第一种抽象产品 Car
public abstract class Car {
    abstract void move();
}

public class Porsche extends Car {
    @Override
    void move() {
        System.out.println("保时捷飞驰而过");
    }
}

public class Maserati extends Car {
    @Override
    void move() {
        System.out.println("玛莎拉蒂紧随其后");
    }
}

//第二种抽象产品 Coffee
public abstract class Coffee {
    abstract void drink();
}

public class LatteMacchiato extends Coffee {
    @Override
    void drink() {
        System.out.println("品尝拿铁玛奇朵");
    }
}

public class Cappuccino extends Coffee {
    @Override
    void drink() {
        System.out.println("品尝卡布奇诺");
    }
}

//抽象工厂:该工厂负责构造,创建各种抽象产品的方法
public abstract class BaseFactory {
    abstract Car createCar();
    abstract Coffee drinkCoffee();
}

//德国人的工厂(具体工厂):他们会生产保时捷,会喝拿铁玛奇朵
public class GermanFactory extends BaseFactory {
    @Override
    Car createCar() {
        System.out.println("生产一辆保时捷");
        return new Porsche();
    }

    @Override
    Coffee drinkCoffee() {
        System.out.println("德国人喝咖啡");
        return new LatteMacchiato();
    }

    //单例
    private GermanFactory() {}

    public static GermanFactory getInstance(){
        return GermanFactoryHolder.INSTANCE;
    }

    private static class GermanFactoryHolder {
        public static final GermanFactory INSTANCE = new GermanFactory();
    }
}

//意大利人的工厂(具体工厂):他们会生产玛莎拉蒂,会喝卡布奇诺
public class ItalianFactory extends BaseFactory {
    @Override
    Car createCar() {
        System.out.println("生产一辆玛莎拉蒂");
        return new Maserati();
    }

    @Override
    Coffee drinkCoffee() {
        System.out.println("意大利人喝咖啡");
        return new Cappuccino();
    }

    //单例
    private ItalianFactory() {}

    public static ItalianFactory getInstance(){
        return ItalianFactoryHolder.INSTANCE;
    }

    private static class ItalianFactoryHolder {
        public static final ItalianFactory INSTANCE = new ItalianFactory();
    }
}

//测试Demo
public class Main {
    public static void main(String[] args) {
        BaseFactory bf1 = GermanFactory.getInstance();
        bf1.createCar().move();
        bf1.drinkCoffee().drink();

        BaseFactory bf2 = ItalianFactory.getInstance();
        bf2.createCar().move();
        bf2.drinkCoffee().drink();

        /**
         * console:
         * 生产一辆保时捷
         * 保时捷飞驰而过
         * 德国人喝咖啡
         * 品尝拿铁玛奇朵
         * 生产一辆玛莎拉蒂
         * 玛莎拉蒂紧随其后
         * 意大利人喝咖啡
         * 品尝卡布奇诺
         */
    }
}

抽象工厂模式的UML图:

抽象工厂模式中有四个角色:抽象工厂、具体工厂、抽象产品、具体产品。抽象工厂可以解决多个产品作为一组进行创建的应用,对改变一个应用的具体工厂非常方便,仅仅需要改变具体工厂的不同产品配置即可,而对于新增一组产品的扩展,也是非常方便。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值