美文网首页
每日一发设计模式 - 简单工厂(simpleFactory)

每日一发设计模式 - 简单工厂(simpleFactory)

作者: 茶铺里的水 | 来源:发表于2019-07-10 18:31 被阅读0次
factory

简单工厂提供一个创建对象实例的功能,无须关心其具体实现。被创建的实例可以是接口、抽象类,也可以是具体的类

简单工厂的结构如下:


简单工厂的结构示意图

从上述结构可以看出,把对API的实例向客户端隐藏了,客户端在调用的时候无需关注具体实现类是哪个,只需要调用工厂创建出一个实例,然后发起调用即可。上述结构整理下如下图

在Java里面,通常情况下是用来创造接口的,但是也可以创造抽象类或普通的类。下图是简单工厂的调用顺序

简单工厂的调用顺序

简单工厂的本质

简单工厂的本质在于选择,而非实现。
所以实现简单工厂的难点就在于如何选择,我们可以采用参数传递、配置文件等等方式来尝试实现。

何时选用简单工厂

  • 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选择简单工厂。
  • 如果想要把对外创建对象的职责集中管理和控制,可以选择简单工厂。

代码示例:

新增对象类

package com.mk.designDemo.designs.factory.model;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Car {
    /**
     * 品牌
     */
    private String brand;

    /**
     * 名称
     */
    private String name;

    /**
     * 生产厂家
     */
    private String manufacturer;

    /**
     * 产地
     */
    private String origin;
}


package com.mk.designDemo.designs.factory.model;

public class BMWCar extends Car {

    public BMWCar(String name) {
        super("BMW", name, "德国BMW", "德国代工厂");
    }
}

package com.mk.designDemo.designs.factory.model;

public class BENZCar extends Car {

    public BENZCar(String name) {
        super("BENZ", name, "德国Benz", "德国代工厂");
    }
}

新增API和实现类

package com.mk.designDemo.designs.factory;

import com.mk.designDemo.designs.factory.model.Car;

public interface CarAPI {
    Car getCar(String carName);
}

package com.mk.designDemo.designs.factory.impl;

import com.mk.designDemo.designs.factory.CarAPI;
import com.mk.designDemo.designs.factory.model.BMWCar;
import com.mk.designDemo.designs.factory.model.Car;

public class BMWCarAPI implements CarAPI {
    @Override
    public Car getCar(String name) {
        return new BMWCar(name);
    }
}

package com.mk.designDemo.designs.factory.impl;

import com.mk.designDemo.designs.factory.Brand;
import com.mk.designDemo.designs.factory.CarAPI;
import com.mk.designDemo.designs.factory.model.BENZCar;
import com.mk.designDemo.designs.factory.model.Car;

@Brand("BENZ")
public class BenzCarAPI implements CarAPI {
    @Override
    public Car getCar(String name) {
        return new BENZCar(name);
    }
}

新增测试类

package com.mk.designDemo.factory;

import com.mk.designDemo.designs.factory.CarAPI;
import com.mk.designDemo.designs.factory.MyCarFactory;
import com.mk.designDemo.designs.factory.model.Car;
import org.junit.Test;

public class CarFactoryTest {

    @Test
    public void getCar() throws Exception {
        CarAPI carAPI = MyCarFactory.getCarApi("BMW");
        Car car = carAPI.getCar("2019款新宝马3系");
        System.out.println(car.toString());
    }
}

测试结果:


简单工厂测试结果

文中内容摘自《研磨设计模式》

相关文章

  • 每日一发设计模式 - 简单工厂(simpleFactory)

    简单工厂提供一个创建对象实例的功能,无须关心其具体实现。被创建的实例可以是接口、抽象类,也可以是具体的类 简单工厂...

  • 大话设计模式之_工厂模式

    大话设计模式之_工厂模式 工程方法(即简单工厂模式simpleFactory,或静态工厂方法 static fac...

  • 01、简单工厂模式--SimpleFactory

    版权声明:本文为博主原创文章,未经博主允许不得转载 PS:转载请注明出处作者: TigerChain地址: htt...

  • 设计模式之简单工厂

    SimpleFactory 简单工厂 Intro 简介 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。...

  • 简单工厂(SimpleFactory)

    简单工厂模式 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式...

  • 设计模式-工厂模式

    设计模式1 设计模式2 工厂模式 工厂模式可简单的分为三类:简单工厂,工厂方法,抽象工厂 简单工厂模式 定义 简单...

  • 设计模式一、单例模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 简单单例(推荐...

  • 设计模式

    设计模式(视频总结) [TOC] 一、简单工厂模式(Simple Factory) 简单工厂模式: 简单工厂模式属...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • 相近设计模式比较

    设计模式干货: 简单工厂模式 vs. 工厂模式 vs. 抽象工厂模式简单工厂和工厂模式区别? 简单工厂没有多个子类...

网友评论

      本文标题:每日一发设计模式 - 简单工厂(simpleFactory)

      本文链接:https://www.haomeiwen.com/subject/jmhckctx.html