一、简单工厂      

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

二、抽象工厂          

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

抽奖工厂好处:

 
好处:如果自己对这一系列东西不满意了,添加自己的系列产品,交通工具从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);
} } @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设计模式-工厂系列的更多相关文章

  1. java设计模式- (1)单例模式

    参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...

  2. JAVA 设计模式 桥接模式

    用途 桥接模式 (Bridge) 将抽象部分与实现部分分离,使它们都可以独立的变化. 桥接模式是一种结构式模式. 结构

  3. java设计模式 策略模式Strategy

    本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...

  4. Java设计模式之行为型模式

    行为型模式共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 策略模式:策略模式的决定权在用户,系统本身提供不同 ...

  5. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  6. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  7. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  8. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  9. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

随机推荐

  1. 动态规划-----hdu 1024 (区间连续和)

    给定一个长度为n的区间:求m段连续子区间的和 最大值(其中m段子区间互不相交) 思路: dp[i][j]: 前j个元素i个连续区间最大值 (重要 a[j]必须在最后一个区间内) 转移方程:dp[i][ ...

  2. PHP5和PHP7的安装、PHP和apache的整合!

    1.PHP5的安装: 下载: wget -c http://cn2.php.net/distributions/php-5.6.36.tar.gz  (php5) wget -c http://cn2 ...

  3. Promise-js中的同步和异步

    js中的同步和异步   自从读了研后,走上了学术之路,每天除了看论文就是做实验,最后发现自己还是喜欢开发呀,于是我又重回前端啦~ 隔了这么久没学前端,好像很多东西都忘了不少,而且不得不说前端的技术更新 ...

  4. LeetCode - Top K Frequent Words

    Given a non-empty list of words, return the k most frequent elements. Your answer should be sorted b ...

  5. Visual Studio不显示智能提示代码,快捷键Alt+→也不出现

    最近安装了Dev Express的控件,我的vs2017 Enterprise版的环境,智能提示补全代码的快捷键功能,好像被修改了,不能使用了. 我原来的时候,比如在代码中输入如下代码: Consol ...

  6. python之路---09 初始函数 参数

    二十七.初始函数 1.函数: 对代码块和功能的封装和定义 2.格式及语法 def  函数名()           #  定义 函数体 函数名()              #  调用 3.    r ...

  7. firefox extension教程

    https://developer.mozilla.org/zh-CN/docs/Add-ons/Overlay_Extensions/XUL_School/The_Essentials_of_an_ ...

  8. [转]从OSI网络模型到TCP/IP协议族简介

    OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型成为开放式系统互联参考模型,是一个把网络通信在逻辑上的定义,也可以理解成为定义了通用的网络通信 ...

  9. storage 事件监听

    在公司的一次内部分享会上, 偶然知道了这个H5的新事件, 解决了我之前的一个bug. 事情是这样的, 第A网页上显示的数量的总和, 点击去是B页面, 可以进行管理, 增加或者删除, 当用户做了增删操作 ...

  10. 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 ...