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中的工厂模式主要是用来将有大量共同接口的类实例化.工厂模式可以动态的决定将哪一个类实例化,不必事先知道要实例化哪个类,将类的实例化的主动权交给工厂而不是类本身.我们常见的 ...
随机推荐
- T-SQL索引
索引 使用索引可以提高查询速度,不是越多越好,会损耗存储空间.应用于出现在where子句中的列建立索引.可以使用sql server 内置工具Profiler捕捉在SQL Server实例上执行的活动 ...
- 附加导航(Affix)行为
用法 通过 data 属性:如需向元素添加附加导航(Affix)行为,只需要向需要监听的元素添加 data-spy="affix" 即可.请使用偏移来定义何时切换元素的锁定和移动. ...
- UVA 1613 K-Graph Oddity
题意; 在一个n个点的无向连通图中,n是奇数,k是使得所有点的度数不超过k的最小奇数,询问一种染色方案,使得相邻点的颜色不同. 分析: k=所有点中最大的入度.如果最大入度是偶数,则k+1.每个点可选 ...
- UVA 1603 Square Destroyer
题意: 给定一个火柴棒拼成的方格阵,然后去掉一些火柴棒,问至少再去掉几根火柴棒能够让图中一个正方形都没有. 思路: 1. 由于题目中给定了 n 的范围,2 * n * (n + 1) <= 60 ...
- Windows SQL Server 2012 R2 安装Intel I217-V/I218-V网卡驱动(转)
1.下载Intel官方驱动: https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=23071&lang=zh ...
- Gson解析JsonObject和JsonArray
Gson中重要的几个核心类: Gson.JsonParser.JsonObject.JsonArray. 下面就是解析的步骤: public void parserJsonArray(String s ...
- python基础之语句结束
1 2 3 4 5 if a : if b: # 这里是if b的作用区间 #这里是if a的作用区间 #这里不在if 区间 python 是按缩进来识别代码块的.
- Qt5 文本编辑
[应用场景]:在编辑框中输入一段文字,用鼠标选取文字,修改工具栏上的字体.字号大小.加粗.斜体等属性,选取的文字即发生相应的变化. 一. 任何一个文本编辑器的程序都要用到QTextEdit ...
- HTML5新元素
<figure> 标签规定独立的流内容(图像.图表.照片.代码等等). <figure> 元素的内容应该与主内容相关,同时元素的位置相对于主内容是独立的.如果被删除,则不应对文 ...
- DOM的认识以及一些节点的应用
HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. HTML DOM 树 通过 ...