Java 工厂模式学习
工厂模式分三种:简单工厂、工厂方法、抽象工厂。其中抽象工厂是用于多个产品族的情况。所谓产品族就是不同产品组成的有机整体,各不同产品之间相互依赖。打个比方,一台电脑有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 工厂模式学习的更多相关文章
- java工厂模式
(1)概念大白话:java工厂模式就是客户端(main函数)要创建对象觉得麻烦就让另外一个叫工厂的类帮它创建,然后自己每次要创建对象就叫工厂帮它弄,举个例子,在没有工厂这个"手下" ...
- Java工厂模式解耦 —— 理解Spring IOC
Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...
- Java学习笔记——Java工厂模式之简单工厂
package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...
- java设计模式之抽象工厂模式学习
工厂模式有个问题就是,类的创建依赖工厂.要想增加一个工厂类,就要修改原来的代码,这违背了闭包原则.所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的 ...
- java设计模式之工厂模式学习
上周安排的写两篇设计模式的文章,结果一篇也没写,今天都给写了.回顾+反思.In this world he who stops ,won't get anything he wants! 工厂方法模式 ...
- 自己理解的java工厂模式,希望对大家有所帮助
[http://www.360doc.com/content/11/0824/17/3034429_142983837.shtml] 这两天突然想学学java源代码,不过看到一篇文章说看java源代码 ...
- JAVA - 工厂模式
1. 简单工厂违背OCP(Open Close Principle)原则 , 即对增加开放,对修改关闭.如果要符合OCP原则,要针对接口编程. //简单工厂模式,违反了OCP原则 public cla ...
- Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式
一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...
- Java 工厂模式(一)— 简单工厂模式
一.什么是工厂模式: Java中的工厂模式主要是用来将有大量共同接口的类实例化.工厂模式可以动态的决定将哪一个类实例化,不必事先知道要实例化哪个类,将类的实例化的主动权交给工厂而不是类本身.我们常见的 ...
随机推荐
- 优先队列(priorityqueue)
队列是先进先出的线性表,顾名思义,优先队列则是元素有优先级的队列,出列的顺序由元素的优先级决定.从优先队列中删除元素是根据优先权的高低次序,而不是元素进入队列的次序.优先队列的典型应用是机器调度等. ...
- (转)c#对象内存模型
对象内存模型 C#的对象内存模型写这篇博客的主要目的是为了加深自己的理解,如有不对的地方,请各位见谅. C#的对象内存模型: 一.栈内存和堆内存1.栈内存 由编译器自动分配和释放,主要用来保存一些局部 ...
- DictoryInfo.GetFiles
using System; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(stri ...
- UVA 10603 Fill
题意: 题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量.一开始只有第三个水杯是满的,剩下的水杯是空的.倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满. ...
- VMware虚拟机中调整Linux分区大小手记(转发)
前段时间用VMware5.5安装了CentOS5.3,安装的时候分配了5Gb的虚拟硬盘空间给Linux系统,系统安装选择很多组件和软件,后面使用时又安装也一些软件,结果导致虚拟硬盘空间不足.查看分 ...
- 查看当前支持的MySQL字符集的命令
查看不同的MySQL字符集有不同的方法,下面介绍的命令用于查看当前支持的MySQL字符集,希望对您学习MySQL字符集能有所帮助. mysql> show char set; +-------- ...
- jsp页面适应手机页面
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scal ...
- HTML5新属性
1.contenteditable 属性指定元素内容是否可编辑. 注意: 当元素中没有设置 contenteditable 属性时,元素将从父元素继承. 所有主流浏览器都支持 contentedita ...
- scikit-learn的主要模块和基本使用
1.加载数据(Data Loading) 假设输入是特征矩阵或者csv文件,首先数据被载入内存. scikit-learn的实现使用了NumPy中的arrays,所以,使用NumPy来载入csv文件. ...
- 1016. 部分A+B
/* * Main.c * 1016. 部分A+B * Created on: 2014年8月30日 * Author: Boomkeeper *******测试通过********* */ #inc ...