zoukankan      html  css  js  c++  java
  • java23种设计模式之八: 工厂方法模式

    定义:

      定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的创建与使用相分离的特点。

      我们把被创建的对象称为产品,把创建产品的对象称为工厂。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫简单工厂模式

      它不属于 GoF 23 种经典设计模式,它的缺点是增加新产品时会违背开闭原则

    优点:

      用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;

      在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

    缺点:

      每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

    结构:

      抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 createProduct() 来创建产品。

      具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

      抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

      具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

    总述:

      对于工厂方法其实就是让工厂生产产品,只不过我们把这个向上提取一下,我们以汽车为例,汽车厂肯定是生产汽车的,但是不同的汽车厂生产的汽车和型号不同,那我们就可以把这个工厂抽象一下,汽车工厂都是生产汽车的,具体哪一种车我们不知道,因此,我们把抽象工厂生产出来的车也是抽象的车,都拥有可以在路上跑的功能。然后,我们该造具体的车了,很简单,我们把具体的汽车品牌实现抽象出来的车就可以,因为具体的车也拥有在路上跑的功能,那这个车可以是奥迪、宝马、奔马等等。既然有了具体的汽车品牌,那我们可以让具体的工厂来造车,因此我们可以让奥迪汽车厂专门造奥迪,宝马专门造宝马,那么我们让具体的工厂实现之前抽象出来的工厂,这样,我们就可以让自家的汽车车生产自家的汽车。

    其实就是:具体的工厂生产具体的产品,让调用者无须参与创建过程。

    就像你买车一样,你会找到自己看中的品牌、车型,买下即可,但你不会参与整个生产过程一样

    //抽象工厂
    public
    interface AbstractFactory { AbstractProductCar createProducet(); } //抽象产品 public interface AbstractProductCar { void run(); } //具体产品 public class AudiCar implements AbstractProductCar{ @Override public void run() { System.out.println("奥迪车在路上跑。。。。。。"); } } //具体产品 public class BMWCar implements AbstractProductCar{ @Override public void run() { System.out.println("宝马车在路上跑。。。。。。"); } } //具体工厂 public class AudiCarFactory implements AbstractFactory{ @Override public AbstractProductCar createProducet() { return new AudiCar(); } } //具体工厂 public class BMWCarFactory implements AbstractFactory{ @Override public AbstractProductCar createProducet() { return new BMWCar(); } } //测试类 public class MainTest { public static void main(String[] args) { AbstractFactory bmwFactory = new BMWCarFactory(); bmwFactory.createProducet().run(); AbstractFactory audi = new AudiCarFactory(); audi.createProducet().run(); } }
  • 相关阅读:
    pytest05-参数化
    pytest04-conftest配置文件
    pytest03-fixture
    pytest02-setup和teardown
    SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static ,必须加锁,或者使用 DateUtils 工具类
    线程池不使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式
    线程资源最好通过线程池提供
    获取单例对象需要保证线程安全,其中的方法也要保证线程安全
    高度注意 Map 类集合 K / V 能不能存储 null 值的情况,如下表格
    使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历的好处
  • 原文地址:https://www.cnblogs.com/MrRightZhao/p/11638594.html
Copyright © 2011-2022 走看看