java 工厂的变形模拟的各种应用
工厂模式是在项目开发中使用效率高,意一个接口,该定义用于创建对象。让子类来决定哪一个类实例。
这就是一个工厂类的示意图
接着来一个简单的样例:
如上图所看到的,我们首先定义我们的产品抽象类接口,也能够是抽象类:
package factory;
public abstract class PlatForm {
public void search(){
System.out.println("你搜索的结果是。。。
。。。
");
}
public abstract void music();
}
以下是一些实现类
package factory;
public class BaiduProduct extends PlatForm{
@Override
public void music() {
System.out.println("baidu music");
}
}
package factory;
public class Qihu360Product extends PlatForm{
@Override
public void music() {
System.out.println("360 music");
}
}
package factory;
public class SogouProduct extends PlatForm{
@Override
public void music() {
System.out.println("sogou music");
}
}
三个实现类已经完毕,以下我们要来一个工厂的抽象类
package factory;
public abstract class Creator {
/**
* 创建一个产品对象,当中T 能够为 String Enum Class等 參数能够自己设置
* @param c
* @return
*/
public abstract <T extends PlatForm> T createProduct(Class<T> c);
}
以下是实现类
package factory;
public class ConcrentCreator extends Creator{
@Override
public <T extends PlatForm> T createProduct(Class<T> c) {
PlatForm plat = null;
try {
/**
* 创建一个用于创建对象的接口,让子类去确定实例化哪一个对象。工厂方法,让一个类的实例化延迟到子类
*/
plat = (PlatForm) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) plat;
}
}
package factory;
public class Client {
public static void main(String[] args) {
Creator creator = new ConcrentCreator();
//在这里能够把你要实例化的类给传进去。然后就可以调用你想要的方法。
PlatForm plat = creator.createProduct(BaiduProduct.class);
plat.search();
plat.music();
}
}
在这里面模仿了一个client,就能够输出你想要的结果。
在工厂模式方法中抽象产品类负责定义产品的共性,实现实物最抽象的定义;creator为产品抽喜创建类,也就是抽象工厂详细怎样创建产品类有详细的实现creator的工厂类来完毕。工厂类的变种非常多,以下,我总结类一个比較通用的源代码。
1:抽象产品类
package factory.total;
public abstract class Product {
public void method1(){
//全部产品的共性
}
//抽象方法 详细有继承它的类去实现
public abstract void method2();
}
2:产品实现类
package factory.total;
public class ConcretProduct1 extends Product{
@Override
public void method2() {
//TODO
}
}
package factory.total;
public class ConcretProduct2 extends Product{
@Override
public void method2() {
//TODO
}
}
3:抽象工厂类
package factory.total;
public abstract class Creator {
public abstract <T extends Product> T createMethod(Class<T> c);
}
4:详细工厂类:
package factory.total;
public class ConcreteCreator extends Creator{
@Override
public <T extends Product> T createMethod(Class<T> c) {
Product pro = null;
try {
pro = (Product) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) pro;
}
}
场景模拟类
package factory.total;
public class Client {
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
Product pro = creator.createMethod(ConcretProduct1.class);
pro.method1();
pro.method2();
}
}
当中工厂模式又分为简单工厂模式,和多级工厂模式,只是这两种情况。和上一种都比較类似了,当中简单工厂模式仅仅是简单的把抽象工厂类去掉,然后把工厂实现类的方法改成static方法。多级工厂模式是指:比如当我们见到一个比較复杂的项目时。全部的产品类都放到一个工厂类中去初始化会显得结构不清晰,那么我们如今就为每一种产品都有自己的一个工厂类;以下我会给出实例多级工厂类的应用。
我是有些基础类还是使用曾经的。仅仅只是为每一个产品添加了一个工厂类
1:抽象工厂类:
package factory.more;
public abstract class AbstractPlatFactory {
public abstract PlatForm createPlat();
}
2:详细工厂类:
package factory.more;
public class BaiduFactory extends AbstractPlatFactory{
@Override
public PlatForm createPlat() {
// TODO Auto-generated method stub
return new BaiduProduct();
}
}
package factory.more;
public class Qihu360Factory extends AbstractPlatFactory{
@Override
public PlatForm createPlat() {
return new Qihu360Product();
}
}
package factory.more;
public class SogouFactory extends AbstractPlatFactory{
@Override
public PlatForm createPlat() {
return new SogouProduct();
}
}
场景类:
package factory.more;
public class Client {
public static void main(String[] args) {
PlatForm plat = new BaiduFactory().createPlat();
plat.search();
plat.music();
}
}
这是多级工厂类的使用,
实际上还有抽象工厂类的应用,它是指为相关对象提供一组接口,如果没有指定具体的类。
(今天太晚了,过了一段时间,然后会说)
版权声明:本文博主原创文章。博客,未经同意不得转载。
java 工厂的变形模拟的各种应用的更多相关文章
- java工厂模式
(1)概念大白话:java工厂模式就是客户端(main函数)要创建对象觉得麻烦就让另外一个叫工厂的类帮它创建,然后自己每次要创建对象就叫工厂帮它弄,举个例子,在没有工厂这个"手下" ...
- java工厂类与反射机制
java 简单工厂类 2012-04-22 15:44:07| 分类: java | 标签:java工厂类 简单工厂类 |举报|字号 订阅 简单工厂模式需要由以下角色组成: 接口 ...
- Java工厂模式解耦 —— 理解Spring IOC
Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...
- Java栈的实例模拟
前言: “后进先出”---是栈(Stack)这种数据结构最基本的特点.很多程序设计语言都具有封装好的Stack工具,本文就带领大家一起将栈温习一下并附上一个模拟栈的程序. Java内存分配中,每通过n ...
- java 16 - 5 LinkedList模拟栈数据结构的集合
请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...
- Java学习笔记——Java工厂模式之简单工厂
package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...
- Java金字塔及变形
Java金字塔 package com.tfj.test; public class JinZiTa { public static void main(String[] args){ int num ...
- Java豆瓣电影爬虫——模拟登录的前世今生与验证码的爱恨情仇
前言 并不是所有的网站都能够敞开心扉让你看个透彻,它们总要给你出些难题让你觉得有些东西是来之不易的,往往,这也更加激发你的激情和斗志! 从<为了媳妇的一张号,我与百度医生杠上了>里就有网友 ...
- JAVA - 工厂模式
1. 简单工厂违背OCP(Open Close Principle)原则 , 即对增加开放,对修改关闭.如果要符合OCP原则,要针对接口编程. //简单工厂模式,违反了OCP原则 public cla ...
随机推荐
- hdu 4465 Candy(2012 ACM-ICPC 成都现场赛)
简单概率题,可以直接由剩余n个递推到剩余0个.现在考虑剩余x个概率为(1-p)的candy时,概率为C(2 * n - x, x) * pow(p, n + 1) *pow(1 - p, n - x ...
- Java equals 和 hashcode 方法
问题 面试时经常会问起字符串比较相关的问题, 总结一下,大体是如下几个: 1.字符串比较时用的什么方法,内部实现如何? 2.hashcode的作用,以及重写equal方法,为什么要重写hashcode ...
- 实现Timeline
Redis实现Timeline 上回写了使用Redis实现关注关系,这次说说使用Redis实现Timeline. Timeline的实现一般有推模式.拉模式.推拉结合这几种.推模式:某人发布内容之后推 ...
- java中final的意义
1.如果一个数据既是static又是final,那么它会拥有一块无法改变的存储空间. 2.final data: 当final用于基本数据类型时,final让其值(value)保持不变,但是当用于ob ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...
- 重新想象 Windows 8 Store Apps (17) - 控件基础: Measure, Arrange, GeneralTransform, VisualTree
原文:重新想象 Windows 8 Store Apps (17) - 控件基础: Measure, Arrange, GeneralTransform, VisualTree [源码下载] 重新想象 ...
- Android呼叫开发系列WebService
我在学习Android第一个问题是在发展进程中遇到Androidclient究竟是怎么用server与数据库交互它?问题是,我有初步接触Android这困扰了我一个非常大的问题.天直到几年前,我突然想 ...
- C# 通过豆瓣网络编程API获取图书信息
这篇文章主要是关于如何通过豆瓣API获取信息的书籍,起初,我看到了原来的想法的内容是"C# 网络编程之网页简单下载实现"中通过HttpWebResponse类下载源代码,再通过正則 ...
- Silverlight的Socket通信
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPwAAAGwCAIAAAACJJ+TAAAgAElEQVR4nO2deXgT5534Rdhskme7+9
- centos安装和卸载软件
==如何卸载: 1.打开一个SHELL终端 2.因为Linux下的软件名都包括版本号,所以卸载前最好先确定这个软件的完整名称. 查找RPM包软件:rpm -qa ×××* 注意:×××指软件名称开头的 ...