java 工厂的变形模拟的各种应用

java 工厂的变形模拟的各种应用

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

 工厂模式是在项目开发中使用效率高,意一个接口,该定义用于创建对象。让子类来决定哪一个类实例。

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();
	}
}

这是多级工厂类的使用,

实际上还有抽象工厂类的应用,它是指为相关对象提供一组接口,如果没有指定具体的类。

(今天太晚了,过了一段时间,然后会说)

版权声明:本文博主原创文章。博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117106.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【数据增强】Cutout「建议收藏」

    【数据增强】Cutout「建议收藏」论文:ImprovedRegularizationofConvolutionalNeuralNetworkswithCutout.Github:https://github.com/uoguelph-mlrg/Cutout.Cutout的出发点和随机擦除一样,也是模拟遮挡,目的是提高泛化能力,实现上比RandomErasing简单,随机选择一个固定大小的正方形区域,然后采用全0填充就OK了,当然为了避免填充0值对训练的影响,应该要对数据进行中心归一化操作,norm到0。(如果你还不了

  • python算法(1)抓交通肇事犯

    python算法(1)抓交通肇事犯抓交通肇事犯1.问题描述一辆卡车违反交通规则,撞人后逃跑。现场有三人目击该事件,但都没有记住车号,只记下了车号的一些特征。甲说:牌照的前两位数字是相同的:乙说:牌照的后两位数字是相同的,但与前两位

  • java整型转换成字符串_java整型转换成字符串

    java整型转换成字符串_java整型转换成字符串二、实验要求1、编写一个Java程序,在程序中进行字符串与数值型数据的转换。2、编写一个Java程序,在程序中通过键盘输入常用的数据,包括字符串、整数和……Strings=”10″;//字符串转换成数值型a=Byte.parseByte(s);b=Short.parseShort(s);//调用Short类的parseShort方法把s转换成短整型c…

    2022年10月19日
  • 最新版本kali安装教程(VMware版本)

    最新版本kali安装教程(VMware版本)一、Kali是什么?KaliLinux是基于Debian的Linux发行版,设计用于数字取证操作系统。每一季度更新一次。由OffensiveSecurityLtd维护和资助。最先由OffensiveSecurity的MatiAharoni和DevonKearns通过重写BackTrack来完成,BackTrack是他们之前写的用于取证的Linux发行版。二、下载kali系统文件温馨提示:在阅读本教程前,请确保你本机已经安装好VMwareWorkstat…

  • xml转为excel_excel表格怎么转换xml格式

    xml转为excel_excel表格怎么转换xml格式旧版的excel文件OfficeXML是xml类型的,也成为SpreadsheetML类型,很古老的excel类型了是2002年左右的格式,现在的格式都是用的xls或者xlsx。遇到的问题就是要把xml类型的OfficeXML转化为xlsx的excel,所以写了本篇文章方便以后遇到这个问题的人。(注意,本文的代码只支持横向的单元格合并,纵向合并的单元格因为会受到横向合并的单元格而对不齐)二、解析类SAXHandler类XmlConvertExcel类XmlRow类三、测试

  • busybox rootfs 与 ubuntu rootfs_boot.img root

    busybox rootfs 与 ubuntu rootfs_boot.img root下载busybox的源码,解压后,设定ARCH和CROSS_COMPILE的两个基本环境变量,选择defconfig作为默认配置,大部分的busybox工具都会被编译出来。如果不指定输出目录,默认输出到根目录的_install目录下面,如果需要指定目录,配置CONFIG_PREFIX=/a/b/c/rootfs,这样make生成的/bin,/sbin,/usr三个默认文件夹就直接在rootfs目录下。makeARCH=armCROSS_COMPILE=arm…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号