java设计模式-工厂系列
一、简单工厂
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{
@Override
public void run(){
System.out.println("car running...");
}
}
Plane:
package com.cy.dp.factory;
public class Plane implements Moveable{
@Override
public void run() {
System.out.println("plane running...");
}
}
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{
@Override
Moveable create() {
return new Car();
}
}
PlaneFactory:
package com.cy.dp.factory;
public class PlaneFactory extends VehicleFactory{
@Override
Moveable create() {
return new Plane();
}
}
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();
}
}
二、抽象工厂
package com.cy.dp.factory; //交通工具
public abstract class Vehicle {
abstract void run();
}
Weapon:
package com.cy.dp.factory; //武器
public abstract class Weapon {
abstract void shoot();
}
Food:
package com.cy.dp.factory; //食物
public abstract class Food {
abstract void printName();
}
Car:
package com.cy.dp.factory;
public class Car extends Vehicle{
public void run(){
System.out.println("car running...");
}
}
AK47:
package com.cy.dp.factory;
public class AK47 extends Weapon{
public void shoot(){
System.out.println("shooting...");
}
}
Apple:
package com.cy.dp.factory;
public class Apple extends Food{
public void printName(){
System.out.println("apple");
}
}
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{
@Override
Vehicle createVehicle() {
return new Car();
}
@Override
Weapon createWeapon() {
return new AK47();
}
@Override
Food 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();
}
}
抽奖工厂好处:
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);
} } @Override
public 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.......");
}
}
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();
} }
java设计模式-工厂系列的更多相关文章
- java设计模式- (1)单例模式
参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...
- JAVA 设计模式 桥接模式
用途 桥接模式 (Bridge) 将抽象部分与实现部分分离,使它们都可以独立的变化. 桥接模式是一种结构式模式. 结构
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- Java设计模式之行为型模式
行为型模式共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 策略模式:策略模式的决定权在用户,系统本身提供不同 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章
原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...
随机推荐
- 如何简单实用hammer
1,首先引用hammer在html中 <script src="js/jquery.hammer.js"></script> 2.在js中创建 ...
- 使用定时器通过改变图片的src来切换图片
点击以后开始自动切换图片 $("#page3_cover_1_back").click(function(){ var i=3; var haha=setInterval(func ...
- hdu-2196 树形dp 求一个树中所有节点能到达的最远距离f[i] (其实也不难嘛!)
#include <bits/stdc++.h> using namespace std; ; struct T { int to; int w; }; vector < vecto ...
- HPU1460: 杨八方的表面兄弟
题目描述 如果你之前关注过HPUOJ的话,那么你一定听说过杨八方的名字.在去年,很多同学共同见证了杨八方同学的填报志愿.来到学校.军训--或许你曾陪同杨八方一起思考过许多问题,又或者你是刚听说这个名字 ...
- BFS模板
bool visit[maxn];///访问标记 ,,,,-,,-,}; ///向左上右下,左下,右上,右下,左上 ,,,-,-,,,-}; struct node { int r; int c; i ...
- C++学习(三十四)(C语言部分)之 链表
1.栈和队列 操作 增查改删重点 插入删除先进先出 -->队列先进后出 -->栈2.链表 写之前先画图存储数据的方式 通过指针将所有的数据链在一起数据结构的目的 管理存储数据 方便快速查找 ...
- hdu2328 Corporate Identity 扩展KMP
Beside other services, ACM helps companies to clearly state their “corporate identity”, which includ ...
- Java 枚举(enum) 详解4种常见的用法
JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 大师兄我又加上自己的理解,来帮助各位理解一下. 用法一:常量 在JDK1.5 之前,我们定义常 ...
- HTTP长连接、短连接究竟
HTTP长连接.短连接究竟是什么? 1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用I ...
- 我发起了一个用 .Net 编写的 源代码管理工具 开源项目 SourceKit
发起这个 项目 的 起因 是 GitHub . Github 的 使用技能 俨然已经成了 一项新技术 , 这不是 工具 的 本意 . 我用过的 源代码 管理工具 不多, SVN 我觉得不错 . 常用 ...