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中的工厂模式主要是用来将有大量共同接口的类实例化.工厂模式可以动态的决定将哪一个类实例化,不必事先知道要实例化哪个类,将类的实例化的主动权交给工厂而不是类本身.我们常见的 ...
随机推荐
- Java程序员应该知道的10个面向对象理论
英文原文:10-object-oriented-design-principles 面向对象理论是面向对象编程的核心,但是我发现大部分 Java 程序员热衷于像单例模式.装饰者模式或观察者模式这样的设 ...
- EMCA创建em资料库时报错
说明:监听程序配置及启动正常.实例运行正常,远程或是本地sqlplus连接实例也正常.主机名显示正常,与主机名相关三个配置文件也没问题. emca报错: [oracle@rusky-oracle11g ...
- JS 利用CNZZ进行站长统计
利用CNZZ对网站进行站长统计 前端页面只需要在body中添加如下代码即可: <script type="text/javascript">var cnzz_proto ...
- JQuery EasyUi 扩展combox验证
随笔记录一下 1.通过select text的值验证 /** * 扩展combox验证,easyui原始只验证select text的值,不支持value验证() */ (function($){ c ...
- Ubuntu 13.10 下安装node
1.首先更新Ubuntu在线包:sudo apt-get update && sudo apt-get dist-upgrade, 2.默认Ubuntu已经安装python的,具体版本 ...
- TSF自定义候选词列表界面
概述 TSF(Text Service Framework),已经取代IMM(Input Method Manager),成为win8+系统的输入法框架.现在有个需求,触摸屏上要使用软键盘(虚拟键盘, ...
- Eclipse用link方式安装插件
其实eclipse安装插件更方便的方法就是直接扔到eclipse目录下的dropins文件夹,但如果插件比较多或者大的话,会让eclipse变得臃肿.下面介绍的用link方式可以避免这样的问题. 用l ...
- mysql 查看mysql版本的四种方法
1 命令行中使用status可以查看. mysql> status;--------------mysql Ver 14.14 Distrib 5.5.25a, for Linux (x86_ ...
- Python中字符串切片操作
一:取字符串中第几个字符 print "Hello"[0] 表示输出字符串中第一个字符print "Hello"[-1] 表示输出字符串中最后一个字符 二: ...
- Swift笔记01
变量使用var 来声明,常量是所有let ,变量名没什么限制 中文表情都可以 ,一般还是使用英文. var str = "luoshuai " //swift语句后面不需要; l ...