一、简单工厂      

1.背景:

任意定制交通工具的类型和生产过程

代码:

Moveable.java

package com.cy.dp.factory;public interface Moveable {void run();
}

Car.java:

package com.cy.dp.factory;public class Car implements Moveable{@Overridepublic void run(){System.out.println("car running...");}}

View Code

Plane:

package com.cy.dp.factory;public class Plane implements Moveable{@Overridepublic void run() {System.out.println("plane running...");}}

View Code

VehicleFactory.java:

package com.cy.dp.factory;/*** 交通工具工厂* @author CY**/
public abstract class VehicleFactory {abstract Moveable create();
}

CarFactory:

package com.cy.dp.factory;public class CarFactory extends VehicleFactory{@OverrideMoveable create() {return new Car();}
}

View Code

PlaneFactory:

package com.cy.dp.factory;public class PlaneFactory extends VehicleFactory{@OverrideMoveable create() {return new Plane();}
}

View Code

Test测试类:

package com.cy.dp.factory;public class Test {public static void main(String[] args) {VehicleFactory factory = new CarFactory();Moveable m = factory.create();m.run();}
}

View Code

question:
要不要把工厂VehicleFactory设计成接口?
答:可以,接口和抽象类其实是一回事;什么时候用抽象类,什么时候用接口?基本上可以采用这样的方式:如果说这个概念在我们脑中确确实实存在的,那你就用抽象类;如果说这个概念仅仅是某些方面的一个特性,比如说会飞的,能跑的,像这一类的东西,我们就把它设计成接口;如果是比较模糊的概念,不知道设计成抽象类还是接口时,那么设计成接口,原因是我们实现了这个接口之后,还可以从其他的抽象类来继承,更灵活。

二、抽象工厂          

控制一系列产品(车、武器、食品...)的替换,举个例子,家里搞装修,现在海尔卖那种整体厨房,油烟机、地板、热水器、微波炉...等等,你能不能够做到我要把一系列产品替换掉的话,它就全替换掉了。这件事情该怎么做呢?
代码:
Vechile:

package com.cy.dp.factory;//交通工具
public abstract class Vehicle {abstract void run();
}

View Code

Weapon:

package com.cy.dp.factory;//武器
public abstract class Weapon {abstract void shoot();
}

View Code

Food:

package com.cy.dp.factory;//食物
public abstract class Food {abstract void printName();
}

View Code

Car:

package com.cy.dp.factory;public class Car extends Vehicle{public void run(){System.out.println("car running...");}}

View Code

AK47:

package com.cy.dp.factory;public class AK47 extends Weapon{public void shoot(){System.out.println("shooting...");}
}

View Code

Apple:

package com.cy.dp.factory;public class Apple extends Food{public void printName(){System.out.println("apple");}
}

View Code

AbstractFactory:

package com.cy.dp.factory;public abstract class AbstractFactory {abstract Vehicle createVehicle();abstract Weapon createWeapon();abstract Food createFood();
}

DefaultFactory:(默认工厂,生产汽车、AK47、苹果)

package com.cy.dp.factory;public class DefaultFactory extends AbstractFactory{@OverrideVehicle createVehicle() {return new Car();}@OverrideWeapon createWeapon() {return new AK47();}@OverrideFood createFood() {return new Apple();}
}

Test:

package com.cy.dp.factory;public class Test {public static void main(String[] args) {AbstractFactory f = new DefaultFactory();Vehicle v = f.createVehicle();v.run();Weapon w = f.createWeapon();w.shoot();Food a = f.createFood();a.printName();}
}

View Code

抽奖工厂好处:

好处:如果自己对这一系列东西不满意了,添加自己的系列产品,交通工具从Vehicle继承,武器从Weapon继承... 然后再产生自己的工厂,不用再修改自己的代码,只需要改AbstractFactory f = new DefaultFactory()这一个地方;如果写在配置文件里,甚至源代码再也不用变了;只改配置文件就ok;
抽象工厂:是它生产了一系列产品,如果你想换掉一系列产品的时候,或者在这一系列产品基础之上进行扩展,想产生新的系列产品以及想对这一系列产品的生产过程进行控制,用抽象工厂。
比较上面两种简单工厂和抽象工厂:
问:抽象工厂和普通的工厂比较,有哪些好的和不好的?
对于普通的工厂来说,可以在产品这个维度进行扩展,可以扩展产品,扩展生产产品的工厂;如果在普通工厂里面产生产品系列,就会很麻烦,比如扩展apple,就要多一个appleFactory,最后就发现工厂泛滥;所以普通的工厂方法来说最后会产生工厂泛滥这种问题;
但是对于抽象工厂来说,也有短处,不能扩展新的产品品种,比如上面有Food、Vehicle、Weapon,想要加一个盔甲,那么AbstractFactory就要加一个create盔甲的抽象方法,所有继承AbstractFactory的类也要加实现,就太麻烦了;
三、spring的bean工厂  
模拟spring的bean工厂:
代码:
BeanFactory:
package com.bjsxt.spring.factory;public interface BeanFactory {Object getBean(String id);
}

ClassPathXmlApplicationContext:

package com.bjsxt.spring.factory;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;public class ClassPathXmlApplicationContext implements BeanFactory  {private Map<String, Object> container = new HashMap<String, Object>();public ClassPathXmlApplicationContext(String fileName) throws Exception{SAXBuilder sb = new SAXBuilder();Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream(fileName));Element root = doc.getRootElement();List list = XPath.selectNodes(root, "/beans/bean");System.out.println(list.size());for (int i = 0; i < list.size(); i++) { Element bean = (Element) list.get(i);String id = bean.getAttributeValue("id");String clazz = bean.getAttributeValue("class");Object o = Class.forName(clazz).newInstance();container.put(id, o);System.out.println(id + " " + clazz);}}@Overridepublic Object getBean(String id) {return container.get(id);}}

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans><bean id="v" class="com.bjsxt.spring.factory.Train"></bean><!--  //v=com.bjsxt.spring.factory.Car  --></beans>

Car:

package com.bjsxt.spring.factory;public class Car implements Moveable{public void run() {System.out.println("car running.......");}
}

View Code

Test测试类:

package com.bjsxt.spring.factory;import java.io.IOException;
import java.util.Properties;public class Test {/*** @param args* @throws IOException */public static void main(String[] args) throws Exception {BeanFactory f = new ClassPathXmlApplicationContext("com/bjsxt/spring/factory/applicationContext.xml");Object o = f.getBean("v");Moveable m = (Moveable)o;m.run();}}

转载于:https://www.cnblogs.com/tenWood/p/9169324.html

java设计模式-工厂系列相关推荐

  1. java备忘录模式应用场景_图解Java设计模式之备忘录模式

    图解Java设计模式之备忘录模式 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. ...

  2. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  3. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  4. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...

  5. java设计模式 观察者模式_理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...

  6. Java设计模式-七大设计原则

    Java设计模式 设计模式七大原则 设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好 代码 ...

  7. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  8. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  9. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

最新文章

  1. 观看5万个游戏视频后,英伟达AI学会了自己开发「吃豆人」
  2. python3 sys.stdout.write 实时打印刷新
  3. 深入理解css优先级
  4. android 将图片路径转二进制,将图像转换为二进制图像中的android
  5. how pwm update
  6. Linux 启动、关闭、重启网络服务的两种方式
  7. 创造需求的6个关键点
  8. CVPR官网不堪重负,挂了 | 最佳论文、人生赢家、六千余人参会
  9. 解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 的访问...
  10. 如何以编程方式确定Java中的操作系统?
  11. 耿建超英语语法---连词
  12. GalGame汉化教程(一)——Ollydbg修改编码和字体
  13. mysql5_MySQL5.5下载-MySQL数据库5.5下载 v5.5.60.1官方版(32位/64位)--pc6下载站
  14. 浏览器播放语音SpeechSynthesisUtterance
  15. 【 微软 2023校园招聘倒计时3天】
  16. 游戏多开计算机内存不足,技术宅 解决天刀多开单开内存不足问题
  17. 宏基因组网络分析工具MetagenoNets
  18. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.8 域和指示器概述...
  19. Solidworks快速装配——带配合装配与阵列装配(带例子解释)
  20. 大学计算机实验图灵机模型与计算机硬件,北理大学计算机实验基础 实验一_图灵机模型与计算机硬件系统虚拟拆装-实验报告.doc...

热门文章

  1. python 取模_中年大叔学编程-Python的基础语法和运算符
  2. docx文档怎么排列图片_PDF怎么转Word?这几款软件满足你的要求
  3. 30天试用期到了_如何战胜被天气支配的恐惧?洗衣干衣不用看“天”,国美干衣机免费等你试!...
  4. 社区发现(二)--GN
  5. Windows10下VB6.0开发——常用的字符串处理函数工具
  6. python3 读写json文件,python3没有读取JSON文件righ
  7. 域名和IP地址并用的理由
  8. spark DataSet与DataFrame的区别
  9. 网易云音乐api资料
  10. YII with()