工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。
工厂模式的形态
工厂模式主要用一下几种形态:
1:简单工厂(Simple Factory)。
2:工厂方法(Factory Method)。
3:抽象工厂(Abstract Factory)。

简单工厂(Simple Factory)
又叫静态工厂,是工厂模式三中状态中结构最为简单的。主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。我们来看一个具体的例子:
假设一家工厂,几生产洗衣机,有生产冰箱,还有空调等等..
我们先为所有产品定义一个共同的产品接口

  1. public interface Product{}

接着我们让这个工厂的所有产品都必须实现此接口

  1. public class Washerimplements Product{
  2. public Washer(){
  3. System.out.println("洗衣机被制造了");
  4. }
  5. }
  6. public class Iceboximplements Product{
  7. public Icebox(){
  8. System.out.println("冰箱被制造了");
  9. }
  10. }
  11. public class AirConditionimplements Product{
  12. public Icebox(){
  13. System.out.println("空调被制造了");
  14. }
  15. }

接下来我们来写一个工厂类,有它来负责生产以上的产品

  1. public class SimpleFactory {
  2. public static Product factory(String productName)throws Exception{
  3. if(productName.equals("Washer")){
  4. return new Washer();
  5. }else if(productName.equals("Icebox")){
  6. return new Icebox();
  7. }else if(productName.equals("AirCondition")){
  8. return new AirCondition();
  9. }else{
  10. throw new Exception("没有该产品");
  11. }
  12. }
  13. }

好了,有了这个工厂类,我们就可以开始下定单了,SimpleFactory将根据不同的定单类决定生产什么产品。

  1. public staticvoid main(String[] args) {
  2. try {
  3. SimpleFactory.factory("Washer");
  4. SimpleFactory.factory("Icebox");
  5. SimpleFactory.factory("AirCondition");
  6. } catch (Exception e) {
  7. e.printStackTrace();
  8. }
  9. }

由上面的代码可以看出,简单工厂的核心就是一个SimpleFactory类,他拥有必要的逻辑判断能力和所有产品的创建权利,我们只需要向把定单给他,就能得到我们想要的产品。这使用起来似乎非常方便。
但,实际上,这个SimpleFactory有很多的局限。首先,我们每次想要增加一种新产品的时候,都必须修改SimpleFactory的原代码。其次,当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖两个字...
还有就是,整个系统都严重依赖SimpleFactory类,只要SimpleFactory类一出问题,系统就进入不能工作的状态,这也是最为致命的一点....
以上的不足将在工厂模式的另外两种状态中得到解决。

工厂方法(Factory Method)
上面的代码告诉我们,简单工厂并不简单,它是整个模式的核心,一旦他出了问题,整个模式都将受影响而不能工作,为了降低风险和为日后的维护、扩展做准备,我们需要对它进行重构,引入工厂方法。
工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能,以下是工厂接口的定义:

  1. public interface Factory{
  2. public Product create();
  3. }

我们再来定义一个产品接口

  1. public interface Product{}

一下是实现了产品接口的产品类

  1. public class Washerimplements Product{
  2. public Washer(){
  3. System.out.println("洗衣机被制造了");
  4. }
  5. }
  6. public class Iceboximplements Product{
  7. public Icebox(){
  8. System.out.println("冰箱被制造了");
  9. }
  10. }
  11. public class AirConditionimplements Product{
  12. public Icebox(){
  13. System.out.println("空调被制造了");
  14. }
  15. }

接下来,就是工厂方法的核心部分,也就是具体创建产品对象的具体工厂类,

  1. //创建洗衣机的工厂
  2. public class CreateWasherimplements Factory{
  3. public Product create(){
  4. return new Washer();
  5. }
  6. }
  7. //创建冰箱的工厂
  8. public class CreateIceboximplements Factory{
  9. public Product create(){
  10. return new Icebox();
  11. }
  12. }
  13. //创建空调的工厂
  14. public class CreateAirConditionimplements Factory{
  15. public Product create(){
  16. return new AirCondition();
  17. }
  18. }

从上面创建产品对象的代码可以看出,工厂方法和简单工厂的主要区别是,简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但工厂方法也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用工厂方法来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难.....

抽象工厂(Factory Method)
抽象工厂:意的意图在于创建一系列互相关联或互相依赖的对象。<<Java设计模式>>
我自己觉得抽象工厂是在工厂方法的基础上引进了分类管理的概念....
工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点,
我们继续用上面的例子来说明:
工厂生产的所有产品都用都用大写字母来标明它们的型号,比如冰箱,就有“冰箱-A",“冰箱-B",同样,其他的产品也都是遵守这个编号规则,于是就有了一下产品家族树

冰箱:

  1. 冰箱-A
  2. 冰箱-B

洗衣机:

  1. 洗衣机-A
  2. 洗衣机-B

我们可以为冰箱和洗衣机分别定义两个产品接口,以对他们进行分类,

  1. //洗衣机接口
  2. public interface Washer{
  3. }
  4. //冰箱接口
  5. public interface Icebox{
  6. }

接着,我们分别创建这两个接口的具体产品

  1. //洗衣机-A
  2. public class WasherAimplements Washer{
  3. public WasherA(){
  4. System.out.println("洗衣机-A被制造了");
  5. }
  6. }
  7. //洗衣机-B
  8. public class WasherBimplements Washer{
  9. public WasherB(){
  10. System.out.println("洗衣机-B被制造了");
  11. }
  12. }
  13. //冰箱-A
  14. public class IceboxAimplements Icebox{
  15. public IceboxA(){
  16. System.out.println("冰箱-A被制造了");
  17. }
  18. }
  19. //冰箱-B
  20. public class IceboxBimplements Icebox{
  21. public IceboxB(){
  22. System.out.println("冰箱-B被制造了");
  23. }
  24. }

到此,产品部分我们准备好了,接下来我们来处理工厂部分,我们先来定义工厂行为接口

  1. public interface Factory{
  2. public Washer createWasher();
  3. public Icebox createIcebox();
  4. }

接下来我创造具体的工厂类,我们根据上面产品的接口,把型号A的产品分为一类,由一个工厂来管理,把型号为B的产品有另一个工厂管理,根据这个分类,我们可以实现如下的两个具体工厂类

  1. //创建型号为A的产品工厂
  2. public class FactoryAimplements Factory{
  3. //创建洗衣机-A
  4. public Washer createWasher(){
  5. return new WasherA();
  6. }
  7. //创建冰箱-A
  8. public Icebox createIcebox(){
  9. return new IceboxA();
  10. }
  11. }
  12. //创建型号为B的产品工厂
  13. public class FactoryBimplements Factory{
  14. //创建洗衣机-B
  15. public Washer createWasher(){
  16. return new WasherB();
  17. }
  18. //创建冰箱-B
  19. public Icebox createIcebox(){
  20. return new IceboxB();
  21. }
  22. }

这样,我们的抽象工厂就完成了。有上面可以看出,在运用上我觉得工厂方法和抽象工厂,都有自己的应用场景,并没有什么优劣之分,但在应用抽象工厂之前,要先对创建的对象进行系统的分类,这点很重要,好的产品分类规则能为具体工厂类的选择调用和以后的扩展提供清晰的思路.

Java设计模式——工厂设计模式的更多相关文章

  1. java简单工厂设计模式

    一.基本定义 /* *简单工厂设计模式: *文字描述理解: * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式. * 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常 * 都具有共同 ...

  2. Java设计模式—工厂设计模式

    工厂设计模式(减少耦合.通过接口或者工厂类来实现) 耦合性:粘度强(依耐性) Person p = new Person();  //耦合性强              Man p = new Per ...

  3. php设计模式-工厂设计模式

    概念: 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式.

  4. java设计模式------工厂设计模式

    总结 以上就是工厂模式的基本实现和详细说明.包括了简单工厂模式.工厂方法模式.抽象工厂模式.我们可以基于需求来选择合适的工厂模式 基本概念:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来 ...

  5. 【51】java设计模式-工厂设计模式剖析

    工厂设计设计模式的分类: 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method) ...

  6. Java基础-工厂设计模式(三锅的肥鸡)

    ---恢复内容开始---   1)还没有工厂时代:假如还没有工业革命,如果一个你要一架飞机,一般的做法是自己去建造一架飞机,然后拿来开 通常的结果就是 有些时候 要么专科螺钉 没打好  要么就是 那个 ...

  7. Java基础面试操作题:Java代理工厂设计模式 ProxyFactory 有一个Baby类,有Cry行为,Baby可以配一个保姆 但是作为保姆必须遵守保姆协议:能够处理Baby类Cry的行为,如喂奶、哄睡觉。

    package com.swift; public class Baby_Baomu_ProxyFactory_Test { public static void main(String[] args ...

  8. 10.Java设计模式 工厂模式,单例模式

    Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...

  9. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

随机推荐

  1. web的seo

    摘要:搜索引擎优化是一种具有很高技术性的活动,也是一种营销功能,必须将它作为营销活动处理.SEO从业者必须理解公司的服务.产品.总体业务战略.竞争形势.品牌.未来网站开发目标和相关的业务构成. SEO ...

  2. 面试官:你了解过Redis对象底层实现吗

    上一章我们讲了Redis的底层数据结构,不了解的人可能会有疑问:这个和平时用的五大对象有啥关系呢?这一章我们就主要解释他们所建立的联系. 看这个文件之前,如果对ziplist.skiplist.int ...

  3. ZooKeeper学习第七期--ZooKeeper一致性原理(转)

    转载来源:https://www.cnblogs.com/sunddenly/p/4138580.html 一.ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过Zo ...

  4. java中list和Arrylist的区别

    List:是一个有序的集合,可以包含重复的元素.提供了按索引访问的方式.它继承 Collection. List有两个重要的实现类:ArrayList 和 LinkedList ArrayList:我 ...

  5. Spring Cloud Gateway使用

    简介 Spring Cloud Gateway是Spring Cloud官方推出的网关框架,网关作为流量入口,在微服务系统中有着十分重要的作用,常用功能包括:鉴权.路由转发.熔断.限流等. Sprin ...

  6. Spring Cloud Config 使用SVN 和 git方式的相关配置

    文件的存储方式: 1.使用svn 当做配置中心 config server的配置方式: 引入svn的包 <dependency> <groupId>org.tmatesoft. ...

  7. ZooKeeper 系列(二)—— Zookeeper单机环境和集群环境搭建

    一.单机环境搭建         1.1 下载         1.2 解压         1.3 配置环境变量         1.4 修改配置         1.5 启动         1. ...

  8. 移动IM开发指南1:如何进行技术选型

    <移动IM开发指南>系列文章将会介绍一个IM APP的方方面面,包括技术选型.登陆优化等.此外,本文作者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各种常见问 ...

  9. python算法与数据结构-栈(43)

    一.栈的介绍 栈作为一种数据结构,是一种只能在一端进行插入和删除操作.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读 ...

  10. swoole异步任务数据报表生成

    <?php include 'vendor/autoload.php'; class server { private $serv; private $db; /** * [__construc ...