一、简单工厂模式

  简单工厂模式(Simple Factory Pattern)由一个工厂对象决定创建哪一种产品类的实例,简单工厂模式适用于工厂类负责创建对象较少的情况,且客户端只需要传入工厂类的参数,对于如何创建对象不关心。

public interface IBlog {
//写随笔
public void write();
}
public class JavaBlog implements IBlog {
@Override
public void write() {
System.out.println("写java随笔");
}
}
public class WriteBlog {
public static void main(String[] args) {
IBlog blog = new JavaBlog();
blog.write();
}
}

  上述代码中,父类 IBlog 指向子类JavaBlog 的引用,应用层需要依赖JavaBlog,如果增加PythonBlog等等更多的课程,客户端就会越来越臃肿。因此要把依赖减弱,把创建细节隐藏。现在我们用简单工厂优化:

public class BlogFactory {
public IBlog create(Class<? extends IBlog> clazz) {
if (null != clazz) {
try {
return clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}

客户端改变:

  public static void main(String[] args) {
BlogFactory blogFactory = new BlogFactory();
IBlog blog = blogFactory.create(JavaBlog.class);
blog.write();
}

  简单工厂模式在JDK中很常见,如Calender类(感兴趣去看源码),还有logback,LoggerFactory中有很多重载的方法getLogger()。但是简单工厂也有缺点:工厂类的职责相对过重,不易于扩展过于复杂的产品结构。

二、工厂方法模式

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

  工厂方法模式主要解决产品扩展问题。在简单工厂模式中,随着产品的增多,如果不同语言书写随笔的逻辑各不相同,工厂职责越来越多,那工厂里面就会乱搞一气,狗屁不通。根据单一职责原则,我们将只能进行拆分,不同工厂做不同事,Java随笔由Java工厂创建,Python随笔由Python工厂创建,对工厂本身进行抽象。

先创建工厂类:

public interface IBlogFactory {
IBlog create();
}

再创建对应工厂:

public class JavaBlogFactory implements IBlogFactory {
@Override
public IBlog create() {
return new JavaBlog();
}
} public class PythonBlogFactory implements IBlogFactory {
@Override
public IBlog create() {
return new PythonBlog();
}
}

客户端:

public class CreateBlog {
public static void main(String[] args) {
IBlogFactory factory = new PythonBlogFactory();
IBlog blog = factory.create();
blog.write(); factory = new JavaBlogFactory();
blog = factory.create();
blog.write();
}
}

总结来说就是:不同工厂抽象出一个工厂头子,不同的工厂创建不同的实例。

工厂方法模式适用于以下场景:

1.创建对象需要大量重复代码。

2.客户端(应用层)不依赖于产品类实例如何被创建、如何被实现等细节。

3.一个类通过其子类来指定创建哪个对象。

缺点:

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

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

三、抽象工厂

  抽象工厂(Abstract Factory Pattern)提供一个黄健一系列相关或相互依赖对象的接口,无需指定具体类。客户端(应用层)不依赖于产品类实例如何被创建、如何被实现等细节,强调的是一系列相关得产品对象(属于同一产品族)一起使用创建对象需要大量重复代码。需要提供一个产品类的库,所有产品以同样接口出现,从而是客户端不依赖于具体实现。

产品族:同一家的不同产品,比如小米,华为,苹果;

产品等级:不同种类的产品,比如 手机,电视,电脑。

工厂要做的就是生产我们牌子的所有产品。以博客为例,java分类的博客有随笔、文章、日记等。

首先创建文章和日记的抽象接口:

public interface IDocument {
void write();
} public interface INote {
void make();
}

再创建抽象工厂:

public interface BlogFactory {
INote createNote(); IDocument createDocument();
}

实现Java文章和日记:

public class JavaDocument implements IDocument {
@Override
public void write() {
System.out.println("写Java文章");
}
} public class JavaNote implements INote {
@Override
public void make() {
System.out.println("写Java笔记");
}
}

实现Java产品族具体工厂:

public class JavaBlogFactory implements BlogFactory {
@Override
public INote createNote() {
return new JavaNote();
} @Override
public IDocument createDocument() {
return new JavaDocument();
}
}

实现Python文章和日记、实现Python具体工厂参考Java的。

客户端调用:

public class BlogTest {
public static void main(String[] args) {
JavaBlogFactory factory = new JavaBlogFactory();
factory.createDocument().write();
factory.createNote().make();
}
}

  上述代码描述了两个产品族的工厂,如果想要扩展产品等级(就是再加点评啥的),要调整抽象工厂、具体工厂。由此可见抽象工厂模式的缺点:

1.规定所有可能被创建的产品集合,产品族(Java系列)中扩展新产品很困难,需要修改抽象工厂及实现;

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

  我们可以利用工厂模式创建好数据源连接池并放到容器中,业务需要时再取出。就避免了用一次创建一次的尴尬。

Spring中常见的设计模式——工厂模式的更多相关文章

  1. Spring中常见的设计模式——代理模式

    一.代理模式的应用场景 生活中的中介,黄牛,等一系列帮助甲方做事的行为,都是代理模式的体现.代理模式(Proxy Pattern)是指为题对象提供一种代理,以控制对这个对象的访问.代理对象在客户端和目 ...

  2. Spring中常见的设计模式——策略模式

    策略模式(Strategy Pattern) 一.策略模式的应用场景 策略模式的应用场景如下: 系统中有很多类,而他们的区别仅仅在于行为不同. 一个系统需要动态的在集中算法中选择一种 二.用策略模式实 ...

  3. Spring中常见的设计模式——委派模式

    一.委派模式的定义及应用场景 委派模式(Delegate Pattern)的基本作用是负责任务的调用和分配,跟代理模式很像,可以看做特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果 ...

  4. Spring中常见的设计模式——原型模式

    1.原型模式应用场景 当遇到大量耗费劳动力的 get,set赋值场景时,如下: public class SetGetParam { public void setParam(UserDto user ...

  5. Spring中常见的设计模式——模板模式

    一.模板模式的应用场景 模板模式又叫模板方法模式(Template Method Pattern),指定义一个算法的骨架,并允许自雷为一个或者多个步骤提供实现.模板模式使得子类可以在不改变算法结果的情 ...

  6. Spring中常见的设计模式——适配器模式

    一.适配器模式的应用场景 适配器模式(Adapter Pattern)是指将一个类的接口转换成用户期待的另一个接口,使原本接口不兼容的类可以一起工作,属于构造设计模式. 适配器适用于以下几种业务场景: ...

  7. 设计模式:JDK和Spring中常见的设计模式

    设计模式 总结 类 工厂模式 封装创建过程,只对结果负责 BeanFactory.Calender 单例模式 全局唯一 ApplicationContext.Calender 原型模式 多重影分身之术 ...

  8. Spring中常见的设计模式——单例模式

    一.单例模式的应用场景 单例模式(singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点.J2EE中的ServletContext,ServletCon ...

  9. spring 中常用的设计模式

    一. Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模 ...

随机推荐

  1. 你必须知道的容器监控 (2) cAdvisor

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章.上一篇我们了解了docker自带的监控子命令以及开源监控工具Weave Scop ...

  2. redis集群之Codis

    在大数据高并发场景下,单个 Redis 实例往往会显得捉襟见肘.首先体现在内存上,单个 Redis 的内存不宜过大,内存太大会导致 rdb 文件过大,进一步导致主从同步时全量同步时间过长,在实例重启恢 ...

  3. fenby C语言 P27使用指针

    使用指针 p代表地址 *p代表这个地址存放的内容 #include <stdio.h> int main(){ int x=100,y=200,*p1=&x,*p2=&y; ...

  4. MySql悲观锁与乐观锁区别及使用场景

    一.概念上的区别 乐观锁( Optimistic Locking):顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,"乐观"的认为加锁一定会成功的,在 ...

  5. Python的深浅拷贝

    Python的深浅拷贝 深浅拷贝 1. 赋值,对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量并不是复制一份内容 list1 = [']] list2 = list1 p ...

  6. 运营的Python指南 - Python 操作Excel

    这是一份写给运营人员的Python指南.本文主要讲述如何使用Python操作Excel.完成Excel的创建,查询和修改操作. 相关代码请参考 https://github.com/RustFishe ...

  7. 2019-2020-1 20199314 《Linux内核原理与分析》 第八周作业

    可执行程序工作原理. 1.ELF(Executable and Linkable Format)可执行和可链接文件,其包含了以下三类: 可重定位文件(Relocatable File):保存着代码和适 ...

  8. 第三十二章 System V信号量(三)

    n哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,n哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,n平时哲学家进行思考,饥饿时便试图取其左.右最靠近 ...

  9. Apache Solr Velocity模板远程代码执行复现

    0x01漏洞描述 2019年10月31日,国外安全研究员s00py在Github公开了一个Apache Solr Velocity模板注入远程命令执行的poc. 经过研究,发现该0day漏洞真实有效并 ...

  10. 使用memset初始化int数组

    memset()是一个来自于string库的函数,正规用法是初始化char类型的数组.因为char类型只占1个字节,memset按字节赋值后,会将char类型数组的所有元素变为你指定的值.但是4字节的 ...