设计模式—工厂模式

工厂模式

工厂模式

一. 简单工厂模式

这个模式本身比较简单,可以使用在业务较简单的情况下!

1. 抽象一个基类或者接口

public abstract class Computer {
}

2. 多个实现类

public class HUAWEIComputer extends Computer {
}
public class LenovoComputer extends Computer {
}

3. 工厂类最顶层的抽象类

public abstract class FactoryAbstract {
    public abstract Computer create();
}

4. 各个实现类的工厂类

public class HUAWEIComputerFactory extends FactoryAbstract {
    @Override
    public Computer create(){
        return new HUAWEIComputer();
    }
}
public class LenovoComputerFactory extends FactoryAbstract {
    @Override
    public Computer create(){
        return new LenovoComputer();
    }
}

二. 工厂方法模式

工厂方法模式主要解决产品扩展的问题

工厂方法模式(Fatory Method Pattern)是通过实现类的工厂类来决定实例化哪个实现类的,工厂方法让类的实例化推迟到子类中进行。在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符 合开闭原则

1. 抽象一个基类或者接口

public abstract class Computer {
}

2. 多个实现类

public class HUAWEIComputer extends Computer {
}
public class LenovoComputer extends Computer {
}

4. 多个实现类的工厂类

public class LenovoComputerFactory extends FactoryAbstract {
    @Override
    public Computer create(){
        return new LenovoComputer();
    }
}
public class HUAWEIComputerFactory extends FactoryAbstract {
    @Override
    public Computer create(){
        return new HUAWEIComputer();
    }
}

总结

在简单工厂中,随着产品链的丰富,但是如果每个 产品的创建逻辑有区别的话,工厂的职责会变得越来越多,有点像万能工厂,并不便于维护,工厂方法模式就解决了这种问题,每个实现类都有自己的工厂,专人做专事

工厂方法的缺点:

  1. 类的个数容易过多,增加复杂度。

  2. 增加了系统的抽象性和理解难度

三. 抽象工厂模式

抽象工厂模式要比工厂方法模式复杂一点,工厂方法模式类似于一对多的关系,抽象工厂模式就像是多对多的关系,类似于多个产品,多个不同的品牌

打个比方:华为不仅仅生产电脑,还生产手机… 联想也是… …也是

这种就可以使用抽象工厂模式

1. 多个产品的抽象类

public abstract class Computer {
}
public abstract class Phone {
}

2. 多个品牌的实现多个产品

华为:

public class HUAWEIComputer extends Computer {
}
public class HUAWEIPhone extends Phone {
}

联想:

public class LenovoComputer extends Computer {
}
public class LenovoPhone extends Phone {
}

3. 工厂类的*抽象类

public abstract class Factory {
    public abstract Phone createPhone();
    public abstract Computer createComputer();
}

4. 各个品牌的工厂类

public class HUAWEIFactory extends Factory {
    @Override
    public Phone createPhone() {
        return new HUAWEIPhone();
    }
    @Override
    public Computer createComputer() {
        return new HUAWEIComputer();
    }
}
public class LenovoFactory extends Factory {
    @Override
    public Phone createPhone() {
        return new HUAWEIPhone();
    }
    @Override
    public Computer createComputer() {
        return new HUAWEIComputer();
    }
}

抽象工厂模式很清楚的展示了多个产品和多个工厂的关系。但是,如果再继续扩展产品,那么代码从抽象工厂,到具体工厂要全部修改,很显然不符合开闭原则。因此抽象工厂也是 有缺点的:

  1. 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂 的接口
  2. 增加了系统的抽象性和理解难度。
上一篇:Spring Cloud (5)hystrix 服务熔断


下一篇:python模块之datetime方法详细介绍