工厂模式创建的对象和java new创建对象过程的对象有什么区别?

java中的Class对象、new关键字 -
- ITeye技术网站
博客分类:
public class TestClass {
public static void main(String[] args) {
// 测试Class.forName()
Class testTypeForName = Class.forName("TestClassType");
System.out.println("testForName--" + testTypeForName);
// 测试类名。class
Class testTypeClass = TestClassType.
System.out.println("testTypeClass--" + testTypeClass);
// 测试Object.getClass()
TestClassType testGetClass = new TestClassType();
System.out.println("testGetClass--" + testGetClass.getClass());
} catch (ClassNotFoundException e) {
e.printStackTrace();
class TestClassType {
// 构造函数
public TestClassType() {
System.out.println("--构造函数--");
// 静态的参数初始化
System.out.println("--静态的参数初始化--");
// 非静态的参数初始化
System.out.println("--非静态的参数初始化--");
输出结果为:
——静态的参数初始化——testForName——class TestClassTypetestTypeClass——class TestClassType——非静态的参数初始化————构造函数——testGetClass——class TestClassType
------------------------------------ 介
绍------------------------------------------------
java.lang.Class
Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。 虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。
Class.forName与new
Class.forName(xxx.xx.xx) 返回的是一个类
首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。 至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。 A a = (A)Class.forName("pacage.A").newInstance(); 这和你 A a = new A(); 是一样的效果。 jvm会执行静态代码段,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。
Class.forName(xxx.xx.xx) 返回的是一个类 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象 String str = 用户输入的字符串 Class t = Class.forName(str); t.newInstance();
在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。 Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如: class c = Class.forName(“Example”); factory = (ExampleInterface)c.newInstance(); 其中ExampleInterface是Example的接口,可以写成如下形式: String className = "Example"; class c = Class.forName(className); factory = (ExampleInterface)c.newInstance(); 进一步可以写成如下形式: String className = readfromXMlC//从xml 配置文件中获得字符串 class c = Class.forName(className); factory = (ExampleInterface)c.newInstance(); 上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。 从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载java API的那个加载器。 现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。 最后用最简单的描述来区分new关键字和newInstance()方法的区别: newInstance: 弱类型。低效率。只能调用无参构造。 new: 强类型。相对高效。能调用任何public构造。
.class与getClass()
.class其实是在java运行时就加载进去的
getClass()是运行程序时动态加载的
public class ExtendClass extends Baseclass {
public String getWidth() {
public void setWidth(String width) {
this.width =
public static void main(String[] arg0) {
Baseclass baseclass1 = new ExtendClass();
Baseclass baseclass2 = new Baseclass();
System.out.println(baseclass1.getClass().getSimpleName());// 实际运行的是继承类Extendclass
System.out.println(baseclass2.getClass().getSimpleName());// 实际运行的是Baseclass
System.out.println(Baseclass.class.getSimpleName());// 加载时类名
System.out.println(ExtendClass.class.getSimpleName());// 加载时类名
class Baseclass {
public String getHeight() {
public void setHeight(String height) {
this.height =
执行结果为:
ExtendClassBaseclassBaseclassExtendClass
feixiang136136
浏览: 7637 次
来自: 南京PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。根据抽象程度不同,PHP工厂模式分为:简单工厂模式、工厂方法模式和抽象工厂模式简单工厂模式:/**
*简单工厂模式与工厂方法模式比较。
*简单工厂又叫静态工厂方法模式,这样理解可以确定,简单工厂模式是通过一个静态方法创建对象的。
class man implements people{
function jiehun() {
echo '送玫瑰,送戒指!&br&';
class women implements people {
function jiehun() {
echo '穿婚纱!&br&';
class SimpleFactoty {
// 简单工厂里的静态方法
static function createMan() {
static function createWomen() {
$man = SimpleFactoty::createMan();
$man-&jiehun();
$man = SimpleFactoty::createWomen();
$man-&jiehun();工厂方法模式:&?php
*工厂方法模式:
*定义一个创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。&整理&
class man implements people{
function jiehun() {
echo '送玫瑰,送戒指!&br&';
class women implements people {
function jiehun() {
echo '穿婚纱!&br&';
createMan {
// 注意了,这里是简单工厂本质区别所在,将对象的创建抽象成一个接口。
function create();
class FactoryMan implements createMan{
function create() {
class FactoryWomen implements createMan {
function create() {
// 简单工厂里的静态方法
function test() {
$Factory =
$man = $Factory-&create();
$man-&jiehun();
$Factory =
$man = $Factory-&create();
$man-&jiehun();
$f = new C
$f-&test();抽象工厂模式:&&?php
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口。
注意:这里和工厂方法的区别是:一系列,而工厂方法则是一个。
那么,我们是否就可以想到在接口create里再增加创建&一系列&对象的方法呢?
class Oman implements people{
function jiehun() {
echo '美女,我送你玫瑰和戒指!&br&';
class Iman implements people{
function jiehun() {
echo '我偷偷喜欢你&br&';
class Owomen implements people {
function jiehun() {
echo '我要穿婚纱!&br&';
class Iwomen implements people {
function jiehun() {
echo '我好害羞哦!!&br&';
createMan {
// 注意了,这里是本质区别所在,将对象的创建抽象成一个接口。
function createOpen(); //分为 内敛的和外向的
function createIntro(); //内向
class FactoryMan implements createMan{
function createOpen() {
function createIntro() {
class FactoryWomen implements createMan {
function createOpen() {
function createIntro() {
// 简单工厂里的静态方法
function test() {
$Factory =
$man = $Factory-&createOpen();
$man-&jiehun();
$man = $Factory-&createIntro();
$man-&jiehun();
$Factory =
$man = $Factory-&createOpen();
$man-&jiehun();
$man = $Factory-&createIntro();
$man-&jiehun();
$f = new C
$f-&test();区别:简单工厂模式:用来生产同一等级结构中的任意产品。对与增加新的产品,无能为力工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品) &&抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族) &以上三种工厂&方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法适用范围:简单工厂模式:工厂类负责创建的对象较少,客户只知道传入工厂类的参数,对于如何创建对象不关心。工厂方法模式:当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中得某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法模式。抽象工厂模式:一个系统不应当依赖于产品类实例何如被创建,组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其 中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从 而使客户端不依赖于实现。无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。
关注微信公众平台js对象及new对象/函数的比较-js教程-网页制作-壹聚教程网js对象及new对象/函数的比较对于js对象与new对象/函数有一些什么样的区别我们可能就不太清楚了,今天一聚教程小编就给各位整理了一些关于js对象及new对象/函数区别,有需要了解的朋友可进入参考。
万物皆对象
在JavaScript的世界,万物皆对象。除了null和,其他基本类型数字,字符串和布尔值都有对应有包装对象。对象的一个特征是你可以在它身上直接调用方法。对于数字基本类型,当试图在其身上调用toString方法会失败,但用括号括起来后再调用就不会失败了,内部实现是用相应的包装对象将基本类型转为对象。所以(1).toString()相当于new Number(1).toString()。因此,你的确可以把基本类型数字,字符串,布尔等当对象使用的,只是注意语法要得体。
同时我们注意到,JavaScript中数字是不分浮点和整形的,所有数字其实均是浮点类型,只是把小数点省略了而以,比如你看到的1可以写成1.,这也就是为什么当你试图1.toString()时会报错,所以正确的写法应该是这样:1..toString(),或者如上面所述加上括号,这里括号的作用是纠正JS解析器,不要把1后面的点当成小数点。内部实现如上面所述,是将1.用包装对象转成对象再调用方法。
使用new则是将之当做构造函数来调用,会创建一个该类的实例对象,这个对象的type是这个函数名,中间使用this.propertyname=value会对该实例对象的属性赋值,并且无论有没有return,都会返回这个对象。
而如果是直接调用就是简单执行里面的代码,不会创建实例对象,this指向的调用环境下的this对象,如果是在全局中直接调用,就是window,没有默认返回值。
想要创建类,一般用前者(构造器模式),当然也可以使用后者,例如工厂模式和寄生构造器模式。
构造器模式:
function Person(name,age,job){
this.name=
this.introduce=function(){
alert(&My name is &+this.name+&, I am&+age+&year(s) old, I am a &+job+&.&);
工厂模式:
function createPerson(name,age,job){
var o=new Object();
寄生构造器模式:
function SpecialArray(){
var values=new Array();
values.push.apply(values,arguments);
values.toPipedString=function(){
return this.join(&|&);
后两种方法的缺点在于因为返回的还是object类型,所以不能通过instanceof来检测实际类型。
下面实例说明一下:
函数能通过new操作符来调用构造器,比如new Chenqiguo()。就其定义而言,和普通的函数没有任何区别。事实上区别在于:当函数调用new操作符时,javascript为它提供了一个prototype对象;而当函数被用作构造器构建新的对象时,其内部的[[prototype]]属性就成为了被构建对象的引用
这句话是什么意思呢,我们先来看下面的代码
function Chenqiguo(){
&&& alert('qiguo');
Chenqiguo()和new Chenqiguo()出来的效果都是一样的,都会打印qiguo这个字符串,而把代码换成如下的方式的话:
function Chenqiguo(){
&&& alert('qiguo');
Chenqiguo.prototype.getName = function(){
&&& alert('prototype qiguo');
我们分别用new实例化构造函数和用普通的函数执行对原型求值
var chenqiguo = new Chenqiguo();//打印qiguo
chenqiguo.getName(); //打印prototype name
var name = Chenqiguo();& //打印qiguo
name.getName();& //会报错, name is undefined
可以看到当我们用new 操作符创建的对象的时候能够打印原型上的值,而用常规函数的时候却不能,这样就解释了在我们当把函数当作构造函数创建新的对象的时候,其内部的prototype属性成为了被创建对象的一个引用.
抛开语言层次来观察函数和构造器的话,构造器的名称通常都使用首字母大写的形式来表表明其是一个构造函数,用小写字母的话就表示其是一个普通的函数.作为javascript的开发人员来说,应该严格区分这两种情况,如果是构造器就首字母大写,否则首字母就小写
上一页: &&&&&下一页:相关内容
养车点点圣杯英雄传编辑推荐
电脑壁纸相关专题当前访客身份:游客 [
拥有积分:10
要比昨天的自己更强~
解答题中心
Javascript创建对象 -- 工厂模式
( 23:11:35) &|
&评论(0)&&|
&阅读次数(118)|
人收藏此文章,
工厂模式, 即以函数来封装以特定接口创建对象的细节.
function createPerson(name, age) {
var o = new Object();
o.sleep = function() {
alert("sleeping...");
var p1 = createPerson("cai10", 22);
var p2 = createPerson("cai20", 25);
alert(p1.name);
alert(p1.age);
p1.sleep();
alert(typeof p1);
alert(p1 instanceof Object);
alert(p1.constructor);
alert(p1.sleep == p2.sleep);
// sleeping...
// function Object() {
[native code]
工厂模式, 即以函数来封装以特定接口创建对象的细节. 函数createPerson()可以通过接受参数来创建含有必要信息的Person对象, 可以多次调用此函数, 每次返回一个包含两个属性和一个方法的对象, 但无法知道一个对象的类型, 即通过typeof,constructor等无法确定对象类型. 此外, p1和p2都有一个sleep()方法, 但它们不是同一个Function实例, 创建两个同样的Function实例是没有必要的, 后面的创建对象模式会解决此些问题.
如有错误, 请指正, 谢谢...
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:(#换为@))收藏,890 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
比如有个abstract class叫item,其他两个类classA和classB都继承item;
使用工厂模式创建一个对象,新建的这个对象是item类,我能通过obj.getType().Name方法判断这个类实际上是classA还是classB;
在我知道这个类实际上是classA还是classB之后,如果想使用classA或者classB他们自己的方法,我应该怎么办?
刚开始接触设计模式这些知识,还希望各位给一些建议!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
面向对象的特性是 抽象 封装 继承 多态
如果A和B有完全不同且和item无关的方法 应该使用接口实现
abstract class item
interface IclassA
interface IclassB
class classA : item, IclassA
public void a()
throw new NotImplementedException();
class classB : item, IclassB
public void b()
throw new NotImplementedException();
item item = new classA();
if (item is IclassA)
var itemA = item as IclassA;
itemA.a();
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
类型转换一下,然后就调用呗
同步到新浪微博
分享到微博?
与我们一起探索更多的未知
专业的开发者技术社区,为用户提供多样化的线上知识交流,丰富的线下活动及给力的工作机会
加入只需一步
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要举报该,理由是:
扫扫下载 App
SegmentFault
一起探索更多未知}

我要回帖

更多关于 java new创建对象过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信