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中的工厂模式主要是用来将有大量共同接口的类实例化.工厂模式可以动态的决定将哪一个类实例化,不必事先知道要实例化哪个类,将类的实例化的主动权交给工厂而不是类本身.我们常见的 ...
随机推荐
- 深入理解JVM : Java垃圾收集器
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都可能会有很大差 ...
- ASP.NET中的路径(path) 详解
一 ASP.NET常用路径(path)获取方法与格式对照表 假设我们的网址为http://localhost:1897/ News/Press/Content.aspx?id=1019 跟 Brows ...
- maven将jar包安装到本地仓库的命令
进入cmd 执行以下命令: mvn install:install-file -Dfile=E:\sqljdbc4.jar -DgroupId=com.microsoft.sqlserver -Dar ...
- VS2012JSON自动生成对应的类
一.复制JSON数据如图 {Key:"aaaa",Value:"bbbb"} 二.点击以下操作
- jquery精简选项卡
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8&qu ...
- Django模板-分离的模板
上一篇Django模板-在视图中使用模板最后的问题,我们需要把数据和展现分离开. 你可能首先考虑把模板保存在文件系统的某个位置并用 Python 内建的文件操作函数来读取文件内容. 假设文件保存在 E ...
- Python下的机器学习工具sklearn--数据预处理
1.数据标准化(Standardization or Mean Removal and Variance Scaling) 进行标准化缩放的数据均值为0,具有单位方差. from sklearn im ...
- LinkList的实现
public class MyLinkedList<AnyType> implements Iterable<AnyType> { @Override public Itera ...
- wifi 攻破
链接1 wifi 加密方式 1,wep加密 2.WPA/WPA2-PSK加密 WPA2 的破解方式: 1 爆力破解 2,pin 破解 1) 先破解 pin 码 2)再用 minidwep-gtk 破解
- CSS自学笔记(10):CSS3盒子模型
CSS3为CSS技术的升级版本.最新版本. 就CSS而言,它是一个模块,是一个庞大而又复杂的模块,但是在CSS3中,将这一个庞大的模块分解为一个个容易理解的同时又很精简的小模块,同时CSS3中又添加了 ...