在上一章,模板模式中,我们在父类规定处理的流程,在子类中实现具体的处理。如果我们将该模式用于生成实例,便演变成了Factory模式,即工厂模式。

在Factory模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体处理全部交给子类进行。

设计实例则是模仿Spring框架进行的操作,模拟制作身份证。为了模拟Spring框架解耦,我们采用分包的方法,即生成实例的框架放在framework包中,而加工处理,具体实现的类放在具体实现的idcard包中。

  • framework包中的product类,用于表示产品这一类东西,定义了一个use抽象方法
  1. package site.wangxin520.gof.factory.framework;
  2.  
  3. /**
  4. * 仿spring框架,定义的一个工厂类生产的产品类
  5. * @author wangXgnaw
  6. *
  7. */
  8. public abstract class Product {
  9.  
  10. /**
  11. * 定义一个顶层抽象方法,用于框架中工厂生产的产品,具体实现交给子类
  12. */
  13. public abstract void use();
  14.  
  15. }
  • framework包中的Factory类
  1. package site.wangxin520.gof.factory.framework;
  2.  
  3. /**
  4. * 仿spring框架,建立一个Factory工厂,定义三个方法,具体实现交给子类完成。
  5. * 这里采用的是模板方法
  6. * @author wangXgnaw
  7. *
  8. */
  9. public abstract class Factory {
  10.  
  11. /**
  12. * 使用模板方法,具体创建product的实现交给子类
  13. * @param owner 产品所有者姓名
  14. * @return Product
  15. */
  16. protected abstract Product createProduct(String owner);
  17. /**
  18. * 注册product
  19. * @param product
  20. */
  21. protected abstract void registerProduct(Product product);
  22.  
  23. /**
  24. * 创建product对象的模板方法
  25. * @param owner 产品所有者姓名
  26. * @return Product
  27. */
  28. public final Product create(String owner){
  29. Product p=createProduct(owner);
  30. registerProduct(p);
  31. return p;
  32. }
  33. }
  • idcard包中的IDCard类
  1. package site.wangxin520.gof.factory.idcard;
  2.  
  3. import site.wangxin520.gof.factory.framework.Product;
  4.  
  5. /**
  6. * 身份证的实体类
  7. * @author wangXgnaw
  8. *
  9. */
  10. public class IDCard extends Product{
  11.  
  12. /**
  13. * 隐藏IDCard的构造函数,拒绝外部包访问,外部包只能通过工厂模式进行访问
  14. */
  15. IDCard() {
  16. }
  17.  
  18. //IDCard的属性
  19. private String owner;
  20. public String getOwner() {
  21. return owner;
  22. }
  23. public void setOwner(String owner) {
  24. this.owner = owner;
  25. }
  26.  
  27. @Override
  28. public void use() {
  29. System.out.println(owner+"使用了身份证");
  30. }
  31.  
  32. }
  • idcard包中的IDCardFactory类
  1. package site.wangxin520.gof.factory.idcard;
  2.  
  3. import java.security.acl.Owner;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import site.wangxin520.gof.factory.framework.Factory;
  8. import site.wangxin520.gof.factory.framework.Product;
  9.  
  10. /**
  11. * 创建身份证的工厂
  12. * @author wangXgnaw
  13. *
  14. */
  15. public class IDCardFactory extends Factory {
  16.  
  17. //记录登记创建了的产品信息,貌似如果是单例模式的话,就可以直接从这里取值了,最好是map结构(猜测)
  18. private List<Product> createdProduct=new ArrayList<Product>();
  19.  
  20. @Override
  21. protected Product createProduct(String owner) {
  22. IDCard idCard=new IDCard();
  23. idCard.setOwner(owner);
  24. System.out.println("创建了"+owner+"的身份证");
  25. return idCard;
  26. }
  27.  
  28. @Override
  29. protected void registerProduct(Product product) {
  30. createdProduct.add(product);
  31. }
  32.  
  33. }
  • 具体测试类
  1. package site.wangxin520.gof.factory.idcard;
  2.  
  3. import site.wangxin520.gof.factory.framework.Factory;
  4. import site.wangxin520.gof.factory.framework.Product;
  5.  
  6. /**
  7. * 测试工厂类
  8. * @author wangXgnaw
  9. *
  10. */
  11. public class FactoryTest {
  12.  
  13. public static void main(String[] args) {
  14.  
  15. Factory factory=new IDCardFactory();
  16.  
  17. Product p1 = factory.create("葵司");
  18. Product p2 = factory.create("上原亚衣");
  19. Product p3 = factory.create("古川伊织");
  20.  
  21. p1.use();
  22. p2.use();
  23. p3.use();
  24.  
  25. }
  26.  
  27. }
  • 最终控制台输出结果为

设计模式之Factory工厂模式的更多相关文章

  1. 设计模式之Factory工厂模式的好处

    最最直观的好处就是吹牛逼,看着要比普通创建对象要屌 好看 一般情况下,我们创建对象使用的是new. Sample sample=new Sample(); 然而,实际情况会比这样复杂的多,比如说 Sa ...

  2. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  3. 设计模式之简单工厂模式(Simple Factory)

    原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...

  4. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  5. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  6. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

  7. iOS设计模式 - (3)简单工厂模式

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

  8. 设计模式-Runoob:工厂模式

    ylbtech-设计模式-Runoob:工厂模式 1.返回顶部 1. 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

  9. JavaScript设计模式一:工厂模式和构造器模式

    转自:http://segmentfault.com/a/1190000002525792 什么是模式 前阵子准备期末考试,挺累也挺忙的,实在闲不得空来更新文章,今天和大家说说javascript中的 ...

随机推荐

  1. iptables安装失败后-------------firewalld回归

    yum install firewalld systemctl stop iptables; systemctl mask iptables; systemctl unmask firewalld s ...

  2. echarts报表

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  3. Desugar Scala(16) -- Lower Bound

    欢迎关注我的新博客地址:http://cuipengfei.me/ Lower bound,不知道这个词的确切中文翻译是怎样的.我们直接看例子吧. 1 2 3 class Pair[T](val fi ...

  4. No mysqld or mysql.server after mariadb-server install

    To start MariaDB on Fedora 20, execute the following command: systemctl start mariadb.service To aut ...

  5. C# 重命名文件

    在vb下,有一个方法可以对文件进行重命名,所以,我们只要引用到这种方法进行应用即可. 1.添加引用Microsoft.VisualBasic 2.添加命名空间using Microsoft.Visua ...

  6. url 模式录制脚本web_concurrent_start和web_concurrent_end

    LoadRunner函数中文翻译系列之三--Concurrent Groupweb_concurrent_start 语法: int web_concurrent_start ( [char * Co ...

  7. Asp.Net MVC 把PartialView、View转换成字符串

    在开发中有时要在后台获得某个View 或者 PartialView 生成的字符串,只要你熟悉Asp.Net MVC  生命周期就能理解和敲出下面的代码.没什么高深的,直接上代码: 1,输出View H ...

  8. ASP.NET MVC 随想录

    http://www.cnblogs.com/OceanEyes/category/696137.html

  9. 微擎app端上传图片后删除不了图片

    相信在微擎开发的哥们都知道, 微擎在手册方面还是有点坑的,根本不让人活啊.没办法, 开发时, 只能自己看着源码来搞>>>> 好, 不多说了. 现在来看一个坑  ..直接上代码\ ...

  10. img与特殊布局下对浏览器渲染的剖析

    补白 在内联元素中,分为替换元素和非替换元素(不了解的同学可以百度一下),非替换元素是不可以设置尺寸的,而替换元素作为特殊的内联元素,由于其自身拥有尺寸属性,所以其的尺寸是可以进行再次设置的. 此文适 ...