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 1907:John(尼姆博弈变形)
John Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submi ...
- HDU2044:一只小蜜蜂...
题目贴不上了︿( ̄︶ ̄)︿http://acm.hdu.edu.cn/showproblem.php?pid=2044 注意数据类型,用int会超范围 #include<stdio.h> ...
- (11)线程池(最新的concurrent.futures包去开启)
'''concurrent.futures是最新的开启线程池的包'''import timefrom concurrent.futures import ThreadPoolExecutor #开启线 ...
- Python--函数对象@命名空间与作用域@包函数@装饰器@迭代器@内置函数
一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...
- PyCharm下载安装
PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性,鉴于目前最新版 PyCharm 使用教程较少,为了节约时间,来介绍一下 PyCharm 在 Windows下是如何安装的. 这是 ...
- .closest 样例收集
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- day 06云计算的三种服务模式:IaaS,PaaS和SaaS
云计算的三种服务模式:IaaS,PaaS和SaaS ”云服务”现在已经快成了一个家喻户晓的词了.如果你不知道PaaS, IaaS 和SaaS的区别,那么也没啥,因为很多人确实不知道. “云”其实是互联 ...
- GPIO引脚操作
Kernel: 4.4 Soc: msm8996 1.用户空间通过sysfs操作GPIO (1)启用GPIO sysfs interface 首先看系统中有没有“/sys/class/gpio”这个文 ...
- postman测试REST接口注意事项
postman在测试第三方REST接口,当POST请求内容要求为application/json时,注意要在postman中设置POST请求体类型设置为raw,然后设置其内容为application/ ...
- js 递归
我理解的递归就是自己调用自己,也就是函数在调用的时候会形成 call stack 调用堆栈.这些数据是用来函数调用完成后,回复之前的函数环境或者局部变量之类的,一般这个都有大小限制,不可能无限生成函数 ...