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三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...
随机推荐
- 动态规划-----hdu 1024 (区间连续和)
给定一个长度为n的区间:求m段连续子区间的和 最大值(其中m段子区间互不相交) 思路: dp[i][j]: 前j个元素i个连续区间最大值 (重要 a[j]必须在最后一个区间内) 转移方程:dp[i][ ...
- PHP5和PHP7的安装、PHP和apache的整合!
1.PHP5的安装: 下载: wget -c http://cn2.php.net/distributions/php-5.6.36.tar.gz (php5) wget -c http://cn2 ...
- Promise-js中的同步和异步
js中的同步和异步 自从读了研后,走上了学术之路,每天除了看论文就是做实验,最后发现自己还是喜欢开发呀,于是我又重回前端啦~ 隔了这么久没学前端,好像很多东西都忘了不少,而且不得不说前端的技术更新 ...
- LeetCode - Top K Frequent Words
Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...
- Visual Studio不显示智能提示代码,快捷键Alt+→也不出现
最近安装了Dev Express的控件,我的vs2017 Enterprise版的环境,智能提示补全代码的快捷键功能,好像被修改了,不能使用了. 我原来的时候,比如在代码中输入如下代码: Consol ...
- python之路---09 初始函数 参数
二十七.初始函数 1.函数: 对代码块和功能的封装和定义 2.格式及语法 def 函数名() # 定义 函数体 函数名() # 调用 3. r ...
- firefox extension教程
https://developer.mozilla.org/zh-CN/docs/Add-ons/Overlay_Extensions/XUL_School/The_Essentials_of_an_ ...
- [转]从OSI网络模型到TCP/IP协议族简介
OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型成为开放式系统互联参考模型,是一个把网络通信在逻辑上的定义,也可以理解成为定义了通用的网络通信 ...
- storage 事件监听
在公司的一次内部分享会上, 偶然知道了这个H5的新事件, 解决了我之前的一个bug. 事情是这样的, 第A网页上显示的数量的总和, 点击去是B页面, 可以进行管理, 增加或者删除, 当用户做了增删操作 ...
- Jenkins 安装启动提示“iJob for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.”
通过RPM安装Jenkins简单方便,不太需要复杂的过程,但是在安装完成以后启动Jenkins的时候提示“Starting jenkins (via systemctl): Job for jenki ...