工厂模式分三种:简单工厂、工厂方法、抽象工厂。其中抽象工厂是用于多个产品族的情况。所谓产品族就是不同产品组成的有机整体,各不同产品之间相互依赖。打个比方,一台电脑有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. Hadoop--初识Hadoop

    什么是Hadoop? 搞什么东西之前,第一步是要知道What(是什么),然后是Why(为什么),最后才是How(怎么做).但很多开发的朋友在做了多年项目以后,都习惯是先How,然后What,最后才是W ...

  2. 第003篇 深入体验C#项目开发(二)

    下半本的5个项目也看完了,还是跳着看,只看大概!        第6章 企业交互系统            作者入职一年,开始带新的2个实习生的项目!一个外资企业内部的OA交互系统,这次又是一个基于w ...

  3. PHP自学4——通过函数将数组数据输出到html的Table标签中(使用函数的例子)

    这一节其实说实话并没有什么干货,不过为了防止PO主的懒癌的复发,还是坚持放一点东西,即使是内容和长度都令人发指.这一节通过一个函数来实现将数组中的内容输出html的Table标签当中显示. 函数文件— ...

  4. 图片占位 css

    手机端图片高度和宽度不能自动比例缩小的问题 <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  5. JQuery EasyUi 扩展combox验证

    随笔记录一下 1.通过select text的值验证 /** * 扩展combox验证,easyui原始只验证select text的值,不支持value验证() */ (function($){ c ...

  6. iOS下的实际网络连接状态检测(转)

    序言 网络连接状态检测对于我们的iOS app开发来说是一个非常通用的需求.为了更好的用户体验,我们会在无网络时展现本地或者缓存的内容,并对用户进行合适的提示.对绝大部分iOS开发者来说,从苹果示例代 ...

  7. iOS设计模式解析(一)工厂方法

    工厂方法:定义创建对象的借口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到了子类 例如      :Shoes厂有两个子类(Newbalance.Nike)构建类图如下: 代码实现: #i ...

  8. 【JQ成长笔记】关于$(this).index与$.each的使用

    本人菜鸟入门,小庙容不下大神的 O(∩_∩)O~~轻喷~ 工作当中响应某个需求,切换选项卡的一个效果,根据每个选项下的内容元素的总数不同而进行不同的html变化(如果选项卡下的内容为空就等于XXX,否 ...

  9. Android 尺寸 神图

  10. MySql 优化 网上资料

    1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽 ...