0
点赞
收藏
分享

微信扫一扫

23中设计模式之工厂模式

工厂模式(不要为了设计模式而设计模式)

工厂模式的意义在于:建造和使用相分离。让子类自己去决定要使用哪一个工厂实现类。
工厂模式主要分为3种

  1. 简单工厂模式(又叫做静态工厂模式)
  2. 工厂方法模式
  3. 抽象工厂方法(在设计模式中它与工厂模式是同级的,当做另一个模式,本质上是工厂的工厂)

简单工厂模式

其实就是抽象出一个具体的工厂类,然后需要啥就从这个静态的工厂类中获得就好。但是它有一个不好的点就是违反了开闭原则,如果你需要新加一种产品,你就要改动这个工厂的代码。并且所有的获取对象都是在这个工厂之中,会造成代码臃肿。但是相对于工厂模式和抽象工厂模式来说,它实现起来比较方便一点,并且更难造成类爆炸。在工作中其实用到的还挺多的。

工厂方法模式

这个设计模式,满足了开闭原则。当产生一个新产品的时候,不需要去改动原来的代码,你只需要去实现你需要增加的产品和对应的产品工厂就行。

在这里插入图片描述

产品接口和工厂接口

public interface Car {
    /**
     * 车的名字
     *
     *
     */
    void name();
}

public interface CarFactory {
    Car getCar();
}

具体实现类

public class Tesla implements Car {

    @Override
    public void name() {
        System.out.println("tesla");
    }
}

public class TeslaFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

当你要实现一个新的产品:比如是大众,你所需要做的就是创建一个大众的工厂类去实现车工厂的接口,创建一个大众类去实现车的接口。不需要动任何原来的代码,满足开闭原则。但是它的类会越来越多。造成类爆炸。

抽象工厂模式

抽象工厂模式和工厂方法模式不同的点在于:抽象工厂又加了一层抽象,它将工厂又抽象出来一个总的工厂,需要你自己去决定使用哪一个具体的工厂。

在这里插入图片描述
可以看到相对于工厂方法模式来说,它的类进一步爆炸。

// 手机抽象
public interface IphoneProduct {
    void open();

    void call();
}

// 路由器抽象
public interface IRouterProduct {
    void wifi();
}

// 工厂抽象
public interface IProductFactory {
    IphoneProduct getPhone();

    IRouterProduct getRouter();
}

// 华为工厂实现工厂接口  实现对应的方法
public class HuaweiFactory implements IProductFactory {
    @Override
    public IphoneProduct getPhone() {
        return new Huaweiphone();
    }

    @Override
    public IRouterProduct getRouter() {
        return new HuaweiRouter();
    }
}

// 华为手机产品
public class Huaweiphone implements IphoneProduct {
    @Override
    public void open() {
        System.out.println("华为打开");
    }

    @Override
    public void call() {
        System.out.println("华为打电话");
    }
}

// 华为路由器产品
public class HuaweiRouter implements IRouterProduct {
    @Override
    public void wifi() {
        System.out.println("华为wifi工作");
    }
}

我们可以看到,如果要创造一个新的产品,其实我们需要将工厂接口中再增加一种产品,需要动原来的代码,所以抽象工厂也是不符合开闭原则的。

举报

相关推荐

0 条评论