设计模式学习笔记(四)之工厂模式(Factory)
今天学习了一下工厂模式(Factory),平时编程的时候需要对象的时候,会使用到大量的new关键字,现在如果使用工厂方法,我们可以必须公开实例化使用new关键字了;
(一) 工厂模式又分了,简单工厂模式,抽象工厂模式,工厂方法模式,首先看下工厂方法模式的类图:
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(); } }
运行效果如下:
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 public interface IProduct { 2 3 public void saleProduct(); 4 5 } 创建一个产品接口,有一个卖产品 ...
- 尚硅谷设计模式学习(四)工厂模式
从披萨店的案例引入工厂模式 披萨的种类很多(比如 GreekPizza.CheesePizza 等) 披萨制作完成后需要进行cut(切片工作),box(包装工作) 完成披萨店的功能 一.简单工厂模式 ...
- 大化设计模式学习笔记(简单工厂模式)
实质:生产具有相同逻辑的构造器类,也就是由一个工厂对象决定创建出哪一种产品类的实例 案例:计算器 demo见https://github.com/mrjdrs/sign-model.git
- 设计模式学习笔记——享元(Flyweight)模式
设计模式学习笔记--享元(Flyweight)模式 @(设计模式)[设计模式, 享元模式, flyweight] 设计模式学习笔记享元Flyweight模式 基本介绍 享元案例 类图 实现代码 Big ...
- 设计模式学习笔记——中介者(Mediator)模式
设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...
- 设计模式学习笔记——单例(Singleton)模式
设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...
- 设计模式学习笔记--Flyweight享元模式
Flyweight模式也叫享元模式,是由GoF提出的23种设计模式中的一种.Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用,所以叫享元. 此模式解决的是由于大量 ...
- 设计模式学习笔记--享元(Flyweight)模式
写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...
- 设计模式学习笔记--Mediator 中介者模式
我们知道面向对象应用程序是由一组为了提供某种服务而彼此交互的对象组成.当彼此引用的对象数量比较少时,此时对象之间就为直接交互(点对点).而当对象的数量增加时,这种直接交互会导致对象之间复杂的.混乱的引 ...
- 【设计模式】第四章 工厂模式
第四章 工厂模式 文章目录 第四章 工厂模式 一.介绍 二.简单工厂模式 三.工厂方法模式 四.抽象工厂模式 一.介绍 工厂模式(Factory Pattern),工厂就是创建产品的地方,根据创建的产 ...
最新文章
- 跨平台网络游戏趋势和优势
- c语言函数指针的理解与使用(学习)
- 基于FPGA的目标点的提取与定位系统设计
- django Forbidden
- 逗号操作符以及(0,function)()
- 动机模型_解读冰山模型:强烈的动机是成功的开始
- 函数的嵌套调用-函数嵌套调用的执行线路图
- ADO.NET与Sql Server和Access的连接
- LINUX编译GtkLP(开源的打印机图形化工具)
- itextpdf生成表格的常见用法
- Linux中文显示乱码问题解决方法(编码查看及转换)
- 阿里云搭建MQTT服务器
- 【VMWare通过vmdk文件创建虚拟机】
- 公交查询系统Android源代码,公交查询源码
- [学习笔记]省选(算法?数据结构?)·线性基
- 同步,异步的区别 异步操作同步化
- java orm全称_[Java-基础] 什么是ORM
- SpringBoot通过@Scheduled实现定时任务
- 嵌入式在军工卫星应用手持终端领域的应用
- filebeat收集java日志_filebeat采集多个项目日志 | 吴老二
热门文章
- Shiro和Zuul权限管理整合方案
- 微信消息推送之过长的文本消息拆分踩坑
- 语音识别系统原理介绍----gmm-hmm
- 【16年浙江省赛 B ZOJ 3937】More Health Points【树上dfs、斜率优化dp、动态维护下凸壳】
- 降维系列之 LDA 线性判别分析
- 使用 LaTeX 语言对 MATLAB 中的图片进行标注
- Flume 1.8.0 用户指南(Flume 1.8.0 User Guide)
- linux下创造进程指令,Linux系统创建一个新进程(下)
- Transport level information does not match with SOAP Message namespace URI错误的理解
- ubuntu14.10 LTS安装完成后鼠标闪烁问题