简单工厂模式

我直接上代码代码里有很详细的注解

//简单工厂模式 是由一个工厂对象决定创建出哪种产品

class Factory1
{publicstatic void main(String[] args){//通过工厂方法生产白面包BreadMakerwhite=BreadFactory.createBreadMaker(0);white.GetMaker();//通过工厂方法生产黑面包BreadMakerblack=BreadFactory.createBreadMaker(1);black.GetMaker();//通过工厂方法生产绿面包BreadMakergreen=BreadFactory.createBreadMaker(2);green.GetMaker();}
}
//面包类抽象类
abstract class BreadMaker{//得到面包抽象方法abstractpublic void GetMaker();}//白面包类 继承抽象类  覆写抽象方法classWhiteBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了白面包");}}
//黑面包类classBlackBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了黑面包");}}//绿面包类classGreenBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了绿面包");}}//面包生产方法  通过静态方法BreadMakercreateBreadMaker(int breadType)决定生产哪种面包classBreadFactory{publicstatic BreadMaker createBreadMaker(int breadType){BreadMakerbreadMaker=null;switch(breadType){case0:breadMaker=new WhiteBread();break;case1:breadMaker=new BlackBread();break;case2:breadMaker=new GreenBread();break;default:break;}returnbreadMaker;}}//有一个问题  当需要增加面包类型时  就需要修改BreadFactory类 增加case分支 这样违反了开闭原则。
//下面就有了工厂方法模式 定义一个用于创建的接口 让子类决定实例化哪个类 工厂方法//使得一个类的实例化延迟到其子类

工厂方法模式

//工厂方法模式 定义一个用于创建的接口
//让子类决定实例化哪个类 工厂方法使得一个类的实例化延迟到其子类
class Factory2
{publicstatic void main(String[] args){IFactorywhiteBreadMakerFactory=new WhiteBreadMakerFactory();BreadMakerwhite=whiteBreadMakerFactory.createBreadMaker();white.GetMaker();IFactoryblackBreadMakerFactory=new BlackBreadMakerFactory();BreadMakerblack=blackBreadMakerFactory.createBreadMaker();black.GetMaker();IFactorygreenBreadMakerFactory=new GreenBreadMakerFactory();BreadMakergreen=greenBreadMakerFactory.createBreadMaker();green.GetMaker();IFactoryblueBreadMakerFactory=new BlueBreadMakerFactory();BreadMakerblue=blueBreadMakerFactory.createBreadMaker();blue.GetMaker();}
}//面包类抽象类
abstract class BreadMaker{//得到面包抽象方法abstractpublic void GetMaker();}//白面包类 继承抽象类  覆写抽象方法classWhiteBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了白面包");}}
//黑面包类classBlackBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了黑面包");}}//绿面包类classGreenBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了绿面包");}}//蓝面包类  新增加classBlueBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了蓝面包");}}//工厂方法接口
interface IFactory
{publicBreadMaker createBreadMaker();
}
//白面包工厂类
class WhiteBreadMakerFactory implementsIFactory
{public  BreadMaker createBreadMaker(){BreadMakerbreadMaker=new WhiteBread();returnbreadMaker;}
}
//黑面包工厂类
class BlackBreadMakerFactory implementsIFactory
{public  BreadMaker createBreadMaker(){BreadMakerbreadMaker=new BlackBread();returnbreadMaker;}
}
//绿面包工厂类
class GreenBreadMakerFactory implementsIFactory
{public  BreadMaker createBreadMaker(){BreadMakerbreadMaker=new GreenBread();returnbreadMaker;}
}
//蓝面包工厂类
class BlueBreadMakerFactory implementsIFactory
{public  BreadMaker createBreadMaker(){BreadMakerbreadMaker=new BlueBread();returnbreadMaker;}
}//通过上面的例子 看以看出  当增加新产品时  在工厂方法模式时  只要相应的增加新增产品的类
// 和工厂类  这样就能很好的符合开闭原则  当然  每增加一个产品 需要增加相应对方类和工厂类 也增加了额外的工作量
// 但是有一个问题 当我们需要增加一个类型的产品 比如披萨  但是我们可以重新利用之前已有的工厂,比如工厂
//的机器、设备等   那该如何呢。 如果按照工厂方法模式 那就需要增加披萨类 和披萨的工厂方法  而且这个工厂是新建的
//如要重新买设备 那该多浪费
// 基于此  提出了抽象工厂模式  比如 生产白面包的工厂还能生产白披萨 那么就节约设备资金啦, 也就是节约了代码量

抽象工厂模式

//抽象工厂模式
class Factory3
{publicstatic void main(String[] args){IFactorywhiteBreadMakerFactory=new WhiteBreadMakerFactory();BreadMakerwhiteBread=whiteBreadMakerFactory.createBreadMaker();whiteBread.GetMaker();PizzawhitePizza=whiteBreadMakerFactory.createPizza();whitePizza.GetMaker();IFactoryblackBreadMakerFactory=new BlackBreadMakerFactory();BreadMakerblackBread=blackBreadMakerFactory.createBreadMaker();blackBread.GetMaker();PizzablackPizza=blackBreadMakerFactory.createPizza();blackPizza.GetMaker();IFactorygreenBreadMakerFactory=new GreenBreadMakerFactory();BreadMakergreenBread=greenBreadMakerFactory.createBreadMaker();greenBread.GetMaker();PizzagreenPizza=greenBreadMakerFactory.createPizza();greenPizza.GetMaker();//另一种类实例化的方法 反射try{Class<?>c=Class.forName("WhiteBreadMakerFactory");try{                          whiteBreadMakerFactory=(IFactory)c.newInstance();whitePizza=whiteBreadMakerFactory.createPizza();whitePizza.GetMaker();}catch(Exception ee){}}catch(ClassNotFoundException e){}}
}//面包类抽象类
abstract class BreadMaker{//得到面包抽象方法abstractpublic void GetMaker();}//白面包类 继承抽象类  覆写抽象方法classWhiteBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了白面包");}}
//黑面包类classBlackBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了黑面包");}}//绿面包类classGreenBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了绿面包");}}//新增的披萨类abstract class Pizza{abstractvoid GetMaker();}//白披萨classWhitePizza extends Pizza{publicvoid GetMaker(){System.out.println("做出了白披萨");}}//黑披萨classBlackPizza extends Pizza{publicvoid GetMaker(){System.out.println("做出了黑披萨");}}//绿披萨classGreenPizza extends Pizza{publicvoid GetMaker(){System.out.println("做出了绿披萨");}}//工厂方法接口
interface IFactory
{publicBreadMaker createBreadMaker();publicPizza createPizza();  //新增 生产披萨方法
}
//白面包工厂类
class WhiteBreadMakerFactory implementsIFactory
{public  BreadMaker createBreadMaker(){BreadMakerbreadMaker=new WhiteBread();returnbreadMaker;}publicPizza createPizza(){returnnew WhitePizza();}
}
//黑面包工厂类
class BlackBreadMakerFactory implementsIFactory
{public  BreadMaker createBreadMaker(){BreadMakerbreadMaker=new BlackBread();returnbreadMaker;}publicPizza createPizza(){returnnew BlackPizza();}
}
//绿面包工厂类
class GreenBreadMakerFactory implementsIFactory
{public  BreadMaker createBreadMaker(){BreadMakerbreadMaker=new GreenBread();returnbreadMaker;}publicPizza createPizza(){returnnew GreenPizza();}
}//从以上代码可以看出 当我们新增一类产品时 而且该类产品能够重用工厂的资源 那么用抽象工厂方法 能够
//很好的解决这个问题//工厂各方法比较
//1.简单工厂模式比较简单 分离了客户端和后台逻辑 使得客户端无需关心后台的实现 去除了客户端与具体产品
//的依赖  增强了移植性能 但是其违背了开闭原则,添加新产品时将会非常麻烦。
//2.工厂方法模式 易于添加新产品 后台模块符合开闭原则 但是新产品的添加会大量的新增类,增加了工作量
//3.抽象工厂模式 分离了具体的类 客户端直接操作抽象接口。//对于工厂模式, 需要灵活应用 在不同的场合运用不同的模式 这样将会使我们的代码更加健壮、并且更易维护和拓展.

学习自 刘径舟老师 张玉华老师编著的《设计模式其实很简单》

Java设计模式学习之工厂模式相关推荐

  1. Java设计模式学习02——工厂模式

    工厂模式 工厂模式主要是为创建对象提供接口,将创建对象的过程隔离起来,实现了创建者与调用者的分离,提高了程序的灵活性.  核心本质: 实例化对象,用工厂方法代替new操作. 将选择实现类.创建对象统一 ...

  2. java设计模式3种工厂模式

    java设计模式3种工厂模式 2010-01-08 16:06:36|  分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...

  3. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  4. Java设计模式学习 - 模版方法模式策略模式

    个人博客项目地址 希望各位帮忙点个star,给我加个小星星✨ 设计模式-模板方法&策略模式 简单介绍 模板方法模式(Template):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. ...

  5. Java设计模式之 简单工厂模式和工厂方法实验报告书

    目录 Java设计模式之 1 简单工厂模式和工厂方法实验报告书 1 实验四:简单工厂模式和工厂方法 2 一.实验目的 2 二.实验内容 2 三.实验步骤 2 3.1简单工厂模式:女娲 2 3.2简单工 ...

  6. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  7. Java设计模式之简单工厂模式实验(软件工程综合实践课程第二周)

    实验目的 1 .理解软件设计的相关理论 : 2 .理解面向对象设计原则: 实验内容 1 .简单工厂模式实验: (1) 参考讲义上的代码,利用简单工厂模式完成计算器应用程序: (2) 画出计算器程序简单 ...

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

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

  9. java简单工厂模式实例造车,JAVA设计模式学习5——工厂方法模式

    工厂方法模式(Factory Method)又称虚拟构造子模式,可以说是简单工厂的抽象,也可以理解为简单工厂是退化了的工厂方法模式,其表现在简单工厂丧失了工厂方法的多态性.我们前一节中提到当产品结构变 ...

最新文章

  1. 十三、java_GUI
  2. 恶心的C语言strtok函数
  3. AcWing - 171 送礼物(双向dfs)
  4. 分布式事务选型的取舍 | 建议收藏
  5. 第一章第一个c#程序上机_我从第一个#100DaysOfCode中学到的东西
  6. printf 指针地址_指针搞都不懂,好意思说自己会C语言?
  7. 开源 计划管理_公司开源计划的三大好处
  8. ModelMap和ModelAndView的作用
  9. android获取有线、wifi、3G(4G)的IP
  10. Struts2.X深入浅出 学习笔记
  11. java聚集_深入理解JAVA中的聚集和组合的区别与联系
  12. php的基本语法与字符串与增删改查
  13. VS2015正确卸载方法,亲测
  14. 免费手机WAP网站大全
  15. ThoughtWorks史凯: 数字化转型不是技术变革,而是企业灵魂深处的自我革命
  16. Linux下DMA驱动
  17. 大屏页面使用transform属性scale进行缩放,高德地图点击事件失效,地图展示模糊
  18. nodejs调用webservice接口(https)
  19. 【随笔记】T507 ADC SGM58031 16BIT 4Channel 调试记录
  20. 从零开始单相在线式不间断电源(UPS)(硬件)

热门文章

  1. 利用U盘进行软件加密(转)
  2. sd 卡驱动--基于高通平台
  3. WINCE6.0+S3C6410睡眠和唤醒的实现
  4. WinCE 应用程序开机自动方法
  5. html 鼠标单击单元格,vue-easytable点击表格中某个单元格操作
  6. FFmpeg 源码学习(一):avformat_open_input 源码分析
  7. java匿名内部类举例和内部类举例
  8. api 和 C# 里的接口的区别?
  9. javascript之原型
  10. AIDL 客户端与服务端的双向通信