工厂模式分三种:简单工厂、工厂方法、抽象工厂。其中抽象工厂是用于多个产品族的情况。所谓产品族就是不同产品组成的有机整体,各不同产品之间相互依赖。打个比方,一台电脑有CPU、主板、内存和硬盘等,这些不同产品组成了一个产品族。就好比Dell和HP要把这些产品进行不同的组装,这时就需要用到抽象工厂。以下是代码演示:

简单工厂,可以用反射实现:

首先定义产品的抽象接口

package com.demo.SimpleFactory;

public interface CPU {
public void run();
}

定义具体产品

package com.demo.SimpleFactory;

public class Intel implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Intel!");
} }
package com.demo.SimpleFactory;

public class Amd implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Amd!");
} }

定义工厂类

package com.demo.SimpleFactory;

public class Factory {
public static CPU create(String str) {
CPU c = null;
try {
c = (CPU) Class.forName("com.demo.SimpleFactory." + str)
.newInstance(); } catch (Exception e) {
e.printStackTrace();
}
return c;
}
}

测试如下

package com.demo.SimpleFactory;

public class Test {
public static void main(String[] args){
CPU c=Factory.create("Amd");
c.run();
}
}

打印结果:

This is Amd!

工厂方法

首先定义产品的抽象接口

package com.demo.SimpleFactory;

public interface CPU {
public void run();
}

定义具体产品

package com.demo.SimpleFactory;

public class Intel implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Intel!");
} }
package com.demo.SimpleFactory;

public class Amd implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Amd!");
} }

定义抽象工厂,具体现实由其子类负责

package com.demo.FactoryMethod;

public interface FactoryMethod {
public CPU create();
}

具体子类工厂

package com.demo.FactoryMethod;

public class AmdFactory implements FactoryMethod {

    @Override
public CPU create() {
// TODO Auto-generated method stub
return new Amd();
} }
package com.demo.FactoryMethod;

public class IntelFactory implements FactoryMethod {
public CPU create() {
return new Intel();
}
}

测试

package com.demo.FactoryMethod;

public class Test {

    public static void main(String[] args) {
FactoryMethod af=new IntelFactory();
CPU c=af.create();
c.run();
}
}

打印结果:

This is Intel!

抽象工厂

首先定义产品的抽象接口

package com.demo.SimpleFactory;

public interface CPU {
public void run();
}

定义具体产品

package com.demo.SimpleFactory;

public class Intel implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Intel!");
} }
package com.demo.SimpleFactory;

public class Amd implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Amd!");
} }
package com.demo.AbstractFactory;

public interface Memory {
public void read(String str);
}
package com.demo.AbstractFactory;

public class KingstonMemory implements Memory {

    public KingstonMemory() {
// TODO Auto-generated constructor stub
} @Override
public void read(String str) {
// TODO Auto-generated method stub
System.out.println("Kingston Read data is:"+str);
} }
package com.demo.AbstractFactory;

public class AdataMemory implements Memory {

    public AdataMemory() {
// TODO Auto-generated constructor stub
} @Override
public void read(String str) {
// TODO Auto-generated method stub
System.out.println("Adata read data is:"+str);
} }

定义抽象工厂

package com.demo.AbstractFactory;

public interface AbstractFactory {

    public CPU createCPU();

    public Memory createMemory();
}

不同子类产生不同产品族

package com.demo.AbstractFactory;

public class DellFactory implements AbstractFactory {

    @Override
public CPU createCPU() {
// TODO Auto-generated method stub
return new Intel();
} @Override
public Memory createMemory() {
// TODO Auto-generated method stub
return new KingstonMemory();
} }
package com.demo.AbstractFactory;

public class HPFactory implements AbstractFactory {

    @Override
public CPU createCPU() {
// TODO Auto-generated method stub
return new Amd();
} @Override
public Memory createMemory() {
// TODO Auto-generated method stub
return new AdataMemory();
} }

测试

package com.demo.AbstractFactory;

public class Test {
public static void main(String[] args){
AbstractFactory hp=new HPFactory();
CPU cpu=hp.createCPU();
Memory memory=hp.createMemory();
cpu.run();
memory.read("Pass");
}
}

打印结果:

This is Amd!
Adata read data is:Pass

Java 工厂模式学习的更多相关文章

  1. java工厂模式

    (1)概念大白话:java工厂模式就是客户端(main函数)要创建对象觉得麻烦就让另外一个叫工厂的类帮它创建,然后自己每次要创建对象就叫工厂帮它弄,举个例子,在没有工厂这个"手下" ...

  2. Java工厂模式解耦 —— 理解Spring IOC

    Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...

  3. Java学习笔记——Java工厂模式之简单工厂

    package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...

  4. java设计模式之抽象工厂模式学习

    工厂模式有个问题就是,类的创建依赖工厂.要想增加一个工厂类,就要修改原来的代码,这违背了闭包原则.所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的 ...

  5. java设计模式之工厂模式学习

    上周安排的写两篇设计模式的文章,结果一篇也没写,今天都给写了.回顾+反思.In this world he who stops ,won't get anything he wants! 工厂方法模式 ...

  6. 自己理解的java工厂模式,希望对大家有所帮助

    [http://www.360doc.com/content/11/0824/17/3034429_142983837.shtml] 这两天突然想学学java源代码,不过看到一篇文章说看java源代码 ...

  7. JAVA - 工厂模式

    1. 简单工厂违背OCP(Open Close Principle)原则 , 即对增加开放,对修改关闭.如果要符合OCP原则,要针对接口编程. //简单工厂模式,违反了OCP原则 public cla ...

  8. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  9. Java 工厂模式(一)— 简单工厂模式

    一.什么是工厂模式: Java中的工厂模式主要是用来将有大量共同接口的类实例化.工厂模式可以动态的决定将哪一个类实例化,不必事先知道要实例化哪个类,将类的实例化的主动权交给工厂而不是类本身.我们常见的 ...

随机推荐

  1. openfire研究之部署连接管理器(connection manager)

    http://blog.sina.com.cn/s/blog_7325f5150101bafh.html 一. Openfire Connection Manager 简介 Openfire Conn ...

  2. javascript模式——Facade

    Facade模式为许多代码提供一个方便的接口,不现实代码实现的复杂性,这样,使用者只需要关心他的使用接口就可以使用. 下面来看一段Facade模式的运用,绑定事件在浏览器之间是不一样的,利用Facad ...

  3. UVA 1312 Cricket Field

    题意: 在w*h的坐标上给n个点, 然后求一个最大的矩形,使得这个矩形内(不包括边界)没有点,注意边界上是可以有点的. 分析: 把坐标离散化.通过两重循环求矩形的高,然后枚举,看是否能找到对应的矩形. ...

  4. JAVASCRIPT——图片滑动效果

    点击按钮开始整体右移,移动至蓝色区域全部显示出来停止. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  5. jsp中添加弹窗口并且实现向后台双向传递数据

    思路:使用jquery-easyui框架实现弹出div,在jsp初始化时从后台获得数据初始化div中的form表单元素的value属性,从而获得后台数据.在点击确定按钮时使用ajax向后台发送数据. ...

  6. 分享个人如何DIY网站的经验

    对于一个接触过Web开发的IT人来说,一般都考虑过创建属于自己的网站,可能是定制自己特有风格的博客类网站,可能是私密的个人主页,也可能是展示自己开源工具的网站,当然,酝酿着做个商业网站来创业的人肯定也 ...

  7. JavaScript实现定点圆周运动

    目是这样的:假设有一定点(400px,300px),通过JavaScript使一个直径20px的圆点以 r=180px 为半径围绕该点做匀速圆周运动. 这个问题的整体实现思想应该是这样的,看到“半径” ...

  8. zookeeper watch 节点

    zjtest7-redis:/root/zk# cat a1.pl use ZooKeeper; use AnyEvent; use AE; use Data::Dumper; use IO::Soc ...

  9. java应用程序远程登录linux并执行其命令(ssh jar包)

    http://www.ganymed.ethz.ch/ssh2/在这个网址下载一个调用ssh和scp命令的jar包. 然后,就可以写程序了.将上面的jar包导入MyEclipse,下面是一个类的实例代 ...

  10. ACM学习-POJ-1004-Financial Management

    菜鸟学习ACM,纪录自己成长过程中的点滴. 学习的路上,与君共勉. ACM学习-POJ-1003-Financial Management Financial Management Time Limi ...