今天学习了一下工厂模式(Factory),平时编程的时候需要对象的时候,会使用到大量的new关键字,现在如果使用工厂方法,我们可以必须公开实例化使用new关键字了;

(一)  工厂模式又分了,简单工厂模式,抽象工厂模式,工厂方法模式,首先看下工厂方法模式的类图:

  
        上面的类图声明了两个抽象类,生成Weapon的抽象工厂类,然后要生产具体的Weapon的之类工厂去实现,还有一个Weapon抽象类,并且定义了一个attack()的抽象方法,子类去继承Weapon类,并且同时实现attack()方法。
在客户端进行使用的时候只要WeaponFactory factory=new XXXFactory() 这里可以new一个具体的实现类即可。。
     看下代码实现:
  ①:Weapon接口类和对应的实现类
package com.jiangqq.dp.simplefactory; //武器的接口类 public interface Weapon {     //同时里面声明一个需要子类实现的方法     public void attack(); }  package com.jiangqq.dp.simplefactory; //具体的轰炸机类 public class Bomber implements Weapon {    @Override  public void attack() {      // TODO Auto-generated method stub      System.out.println("轰炸机发射×××.....");  } }   package com.jiangqq.dp.simplefactory; //具体的机枪的类 public class Gun implements Weapon {  @Override  public void attack() {      // TODO Auto-generated method stub      System.out.println("机枪发射×××....");    } } 

②:WeaponFactory工厂和具体的创建对象工厂实现类:

package com.jiangqq.dp.simplefactory; //武器的创建接口类 public interface WeaponFactory {    public Weapon create(); }   package com.jiangqq.dp.simplefactory; //机枪的具体实现类 public class GunFactory implements WeaponFactory {     //创建一个具体的机枪对象   @Override  public Weapon create() {        return new Gun();   } }  package com.jiangqq.dp.simplefactory; //轰炸机的具体实现类 public class BomberFactory implements WeaponFactory {    //创建一个具体的轰炸机对象  @Override  public Weapon create() {        return new Bomber();    } } 

③:下面是Client测试方法:

package com.jiangqq.dp.simplefactory;  /**=================================  * 简单工厂模式测试客户端  * @author jiangqq  * @time 2012/3/15 20:57  * ====================================  */ public class ClientTest {   public static void main(String[] args) {        //声明一个可以生成机枪对象的工厂       WeaponFactory factory1 = new GunFactory();         //创建出对象的Weapon,--->Gun       Weapon weapon1=factory1.create();      //调用具体方法...         weapon1.attack();       WeaponFactory factory2 = new BomberFactory();      Weapon weapon2=factory2.create();      weapon2.attack();   } } 

运行效果如下:

        
      
       使用接口,工厂方法,我们可以很好的去把类中相同的实现方法抽取能接口,这样我们就可以进行面向接口编程,并且在工厂实现类中进行对象的实例化,有效减了少在Client端调用的时候公开化的new实例化对象........
       但是如果我们要一次性的生成一系列的产品的时候,如果还是使用工厂方法模式的话,那就在客户端实例化的对象将会一次性成倍增加,这就需要用到抽象工厂模式了。
      
     (二)接着我们来看看另一种工厂模式---抽象工厂模式,同样先看一下类图:
     
     直接看这张图有点复杂:简单的解释一下:上面有三个抽象类分别是
 ①:抽象工厂类(AbstractFactory):并且其中声明了两个创建具体对象的方法,让它的实现类继承并且实现,其中实现它的FirstFactory和SecondFactory是具体工厂生成出来的产品,且可以生成出一系列的对象如:Apple,Bomber...
 ②:下面两个为Fruits,Weapon抽象类,并且具体子类去实现,可以实例化具体的对象,
 先看如客户端测试的代码
package com.jiangqq.dp.abstractfactory; /*  * ==========================================   * 抽象工厂模式测试客户端  * @author jiangqq  * @time 2012/3/15/ 21:28 =============================================  */ public class ClientTest {    public static void main(String[] args) {        System.out.println("第一个工厂================================");      //生成一个具体的产品         AbstractFactory factory1 = new FirstFactory();         //得到weapon      Weapon weapon1 = factory1.createWeapon();      //得到fruits      Fruits fruits1 = factory1.createFruits();      //根据生成的对象调用具体的方法        weapon1.attack();       fruits1.eat();      System.out.println("第二个工厂================================");      AbstractFactory factory2 = new SecondFactory();        Weapon weapon2 = factory2.createWeapon();      Fruits fruits2 = factory2.createFruits();      weapon2.attack();       fruits2.eat();  } } 

工厂类:

package com.jiangqq.dp.abstractfactory; //工厂抽象类 public abstract class AbstractFactory {    //定义创建武器类,让继承它的具体工厂类具体去实现    public abstract Weapon createWeapon();  //定义创建水果类,让继承它的具体工厂类具体去实现    public abstract Fruits createFruits(); }    package com.jiangqq.dp.abstractfactory; //具体生产对象类 public class FirstFactory extends AbstractFactory {   //生产出机枪     @Override  public Weapon createWeapon() {      return new Gun();   }   //生成出香蕉     @Override  public Fruits createFruits() {      return new Banana();    } }    package com.jiangqq.dp.abstractfactory; //具体生产对象类 public class SecondFactory extends AbstractFactory {   // 生产出轰炸机   @Override  public Weapon createWeapon() {      return new Bomber();    }   // 生产出苹果    @Override  public Fruits createFruits() {      return new Apple();     } } 

Fruits类:

package com.jiangqq.dp.abstractfactory; //水果抽象类 public abstract class Fruits {    //声明的水果的方法,具体让子类去实现  public abstract void eat(); }    package com.jiangqq.dp.abstractfactory; //苹果具体类 public class Apple extends Fruits {    //实现苹果的方法   @Override  public void eat() {         System.out.println("吃这苹果.....");  } }  package com.jiangqq.dp.abstractfactory; //香蕉具体类 public class Banana extends Fruits { //实现香蕉的方法     @Override  public void eat() {     System.out.println("吃着香蕉.....");  } }  

Weapon类:

package com.jiangqq.dp.abstractfactory; //武器抽象类 public abstract class Weapon {    //声明武器的方法,具体让子类去实现     public abstract void attack(); }  package com.jiangqq.dp.abstractfactory; //机枪的具体类 public class Gun extends Weapon{ //实现机枪的方法   public void attack() {      // TODO Auto-generated method stub      System.out.println("机枪发射×××....");    } }   package com.jiangqq.dp.abstractfactory; //轰炸机的具体实现类 public class Bomber extends Weapon {  //实现轰炸机的方法  @Override  public void attack() {      // TODO Auto-generated method stub      System.out.println("轰炸机发射×××.....");  } } 

虽然使用抽象工厂模式,在我们需要一次性实例化一系列的产品的时候,方便很多,但是如果需要增加新的产品的时候,那么类的数量也会成倍的增加,所以说使用工厂方法或者抽象工厂都会有利有弊的,决定于具体场合我们去实现;

最后一个是简单工厂模式,但是简单工厂模式不是严格意义上的设计模式,所以这里也没有具体列出来....
     

转载于:https://blog.51cto.com/2939716/1376469

设计模式学习笔记(四)之工厂模式(Factory)相关推荐

  1. 设计模式学习笔记(一)之工厂模式、单例模式

    一.工厂模式 (1)简单工厂模式: 1 public interface IProduct { 2 3 public void saleProduct(); 4 5 } 创建一个产品接口,有一个卖产品 ...

  2. 尚硅谷设计模式学习(四)工厂模式

    从披萨店的案例引入工厂模式 披萨的种类很多(比如 GreekPizza.CheesePizza 等) 披萨制作完成后需要进行cut(切片工作),box(包装工作) 完成披萨店的功能 一.简单工厂模式 ...

  3. 大化设计模式学习笔记(简单工厂模式)

    实质:生产具有相同逻辑的构造器类,也就是由一个工厂对象决定创建出哪一种产品类的实例 案例:计算器 demo见https://github.com/mrjdrs/sign-model.git

  4. 设计模式学习笔记——享元(Flyweight)模式

    设计模式学习笔记--享元(Flyweight)模式 @(设计模式)[设计模式, 享元模式, flyweight] 设计模式学习笔记享元Flyweight模式 基本介绍 享元案例 类图 实现代码 Big ...

  5. 设计模式学习笔记——中介者(Mediator)模式

    设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...

  6. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  7. 设计模式学习笔记--Flyweight享元模式

    Flyweight模式也叫享元模式,是由GoF提出的23种设计模式中的一种.Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用,所以叫享元.   此模式解决的是由于大量 ...

  8. 设计模式学习笔记--享元(Flyweight)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...

  9. 设计模式学习笔记--Mediator 中介者模式

    我们知道面向对象应用程序是由一组为了提供某种服务而彼此交互的对象组成.当彼此引用的对象数量比较少时,此时对象之间就为直接交互(点对点).而当对象的数量增加时,这种直接交互会导致对象之间复杂的.混乱的引 ...

  10. 【设计模式】第四章 工厂模式

    第四章 工厂模式 文章目录 第四章 工厂模式 一.介绍 二.简单工厂模式 三.工厂方法模式 四.抽象工厂模式 一.介绍 工厂模式(Factory Pattern),工厂就是创建产品的地方,根据创建的产 ...

最新文章

  1. 跨平台网络游戏趋势和优势
  2. c语言函数指针的理解与使用(学习)
  3. 基于FPGA的目标点的提取与定位系统设计
  4. django Forbidden
  5. 逗号操作符以及(0,function)()
  6. 动机模型_解读冰山模型:强烈的动机是成功的开始
  7. 函数的嵌套调用-函数嵌套调用的执行线路图
  8. ADO.NET与Sql Server和Access的连接
  9. LINUX编译GtkLP(开源的打印机图形化工具)
  10. itextpdf生成表格的常见用法
  11. Linux中文显示乱码问题解决方法(编码查看及转换)
  12. 阿里云搭建MQTT服务器
  13. 【VMWare通过vmdk文件创建虚拟机】
  14. 公交查询系统Android源代码,公交查询源码
  15. [学习笔记]省选(算法?数据结构?)·线性基
  16. 同步,异步的区别 异步操作同步化
  17. java orm全称_[Java-基础] 什么是ORM
  18. SpringBoot通过@Scheduled实现定时任务
  19. 嵌入式在军工卫星应用手持终端领域的应用
  20. filebeat收集java日志_filebeat采集多个项目日志 | 吴老二

热门文章

  1. Shiro和Zuul权限管理整合方案
  2. 微信消息推送之过长的文本消息拆分踩坑
  3. 语音识别系统原理介绍----gmm-hmm
  4. 【16年浙江省赛 B ZOJ 3937】More Health Points【树上dfs、斜率优化dp、动态维护下凸壳】
  5. 降维系列之 LDA 线性判别分析
  6. 使用 LaTeX 语言对 MATLAB 中的图片进行标注
  7. Flume 1.8.0 用户指南(Flume 1.8.0 User Guide)
  8. linux下创造进程指令,Linux系统创建一个新进程(下)
  9. Transport level information does not match with SOAP Message namespace URI错误的理解
  10. ubuntu14.10 LTS安装完成后鼠标闪烁问题