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三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...
随机推荐
- PTA——判断胖瘦
PTA 7-40 到底是不是太胖了 #include<stdio.h> #include<math.h> int main() { ,N; scanf("%d&quo ...
- maven(一)
Maven的简介 什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的 Maven好处 普通的传统项目 maven项目 分析:maven项目为什么这么小? ...
- C# WinForm 菜单项的大小、高宽的手动控制
控制菜单项的第一级的下级菜单项的大小: 直接通过(ContextMenuStrip对象).AutoSize = false.(ContextMenuStrip对象).Size = new Size(5 ...
- 深入浅出:MySQL的左连接、右连接、内连接
http://blog.csdn.net/wyzxg/article/details/7276979 三种连接的语法 为便于更多的技友快速读懂.理解,我们只讨论2张表对象进行连接操作的情况,大于2张表 ...
- VBA: 怎样批量数据从Excel派出到Visio
上周派到了个case, 是批量从Excel导出数据导Visio每个图形中. 花了些时间实现了这个功能. 原理如下: 打开Excel 新建/打开表单 指向所选择的表单 遍历所在列的所有数据 打开Visi ...
- 记录:.user.ini 使用
记录:.user.ini 使用 可以用于防跨站配置. .user.ini 注意安全问题 动态加载,默认 5 分钟自动刷新. php 5.3 以后的版本支持. 修改完成后再将文件锁定. 相关链接: 神秘 ...
- [c/c++]fopen用法及参数介绍
函数定义: FILE * fopen ( const char * filename, const char * mode ); 参数mode: "r" read: 为输入操作打开 ...
- Centos6.8 Mysql5.6 安装配置教程(转)
准备Mysql文件: 方式一:wget url(mysql下载地址); 方式二:从官网下载mysql,上传至centos(小编使用的Nodepad++的NppFTP具体做法请百度); 检查之前安装 ...
- java直接量(literal)
直接量就是代码中直接使用的值,如 int i = 7; char c = 'a'; boolean b = false; 7.'a'.false就是直接量. java有三种类型的直接量:基本类型. ...
- C# 打印、输入和for循环的使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...