博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式:简单工厂、工厂方法、抽象工厂之区别和小结
阅读量:6288 次
发布时间:2019-06-22

本文共 2618 字,大约阅读时间需要 8 分钟。

  hot3.png

 
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。

本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解。

 

简单工厂

简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。

不修改代码的话,是无法扩展的。

简单工厂

代码示例:

public interface Api {    void doSomething(String thing);}public class ImpA implements Api {    @Override    public void doSomething(String thing) {        System.out.println("ImpA  thing ="+thing);    }}public class ImpB implements Api{    @Override    public void doSomething(String thing) {        System.out.println("ImpB  thing ="+thing);    }}public class Factory {    public static Api createApi(int condition){       Api api = null;        if (condition==1)            api = new ImpA();        if (condition == 2) {            api = new ImpB();        }        return api;    }}/** * 简单工厂本质:选择实现! * * 简单工厂优点: * * 1:帮助封装 * 2:解耦 * * 简单工厂缺点: * * 1:不方便扩展子工厂, * 2:增加客户端难度,因为客户端要知道参数代表的 功能和含义,也部分暴露了内部实 现,这种情况建议使用可配置的方式实现。 */public class Client {    public static void main(String[] args) {        Api api = Factory.createApi(2);        api.doSomething("正在使用简单工厂");    }}

 

工厂方法

工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。

在同一等级结构中,支持增加任意产品。

工厂方法

 

 

public interface FactoryMethod {    Product createProduct();}public class FactoryA implements FactoryMethod {    @Override    public Product createProduct() {        return new CreateProductA();    }}public class FactoryB implements FactoryMethod {    @Override    public Product createProduct() {        return new CreateProductB();    }}public class CreateProductA implements Product {    @Override    public void opration1() {        System.out.println("ProductA.opration1");    }    @Override    public void opration2() {        System.out.println("ProductA.opration2");    }}public interface Product {    void  opration1();    void  opration2();}public class CreateProductB implements Product {    @Override    public void opration1() {        System.out.println("ProductB.opration1");    }    @Override    public void opration2() {        System.out.println("ProductB.opration2");    }}

FactoryMethod factory = new FactoryA();Product product = factory.createProduct();product.opration1();

抽象工厂

抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。

应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

抽象工厂

 

 

 

小结

★工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。

★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。

★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。

 

区别

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   

抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)  

以上三种工厂 方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法

转载于:https://my.oschina.net/dyyweb/blog/591583

你可能感兴趣的文章
磁盘空间满引起的mysql启动失败:ERROR! MySQL server PID file could not be found!
查看>>
点播转码相关常见问题及排查方式
查看>>
[arm驱动]linux设备地址映射到用户空间
查看>>
弗洛伊德算法
查看>>
【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
查看>>
精度 Precision
查看>>
Android——4.2 - 3G移植之路之 APN (五)
查看>>
Linux_DHCP服务搭建
查看>>
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
秋式广告杀手:广告拦截原理与杀手组织
查看>>
翻译 | 摆脱浏览器限制的JavaScript
查看>>
闲扯下午引爆乌云社区“盗窃”乌云币事件
查看>>
02@在类的头文件中尽量少引入其他头文件
查看>>
JAVA IO BIO NIO AIO
查看>>
input checkbox 复选框大小修改
查看>>
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>