java 工厂模式例子_java 工厂模式简单介绍及例子[通俗易懂]

java 工厂模式例子_java 工厂模式简单介绍及例子[通俗易懂]java中工厂模式在javaee中经常碰见,是一种常见的模式,其可分为三种:静态工厂模式、工厂方法模式、抽象工厂模式。一下做一简单讲述和例子。静态工厂模式:顾名思义就知道他是用静态方法实现的,其创建的对象具有一定的特性,譬如说是某类的派生或者某接口的实现。其比较简单。例子如下Animal类:packagecom.bean;/***动物类*@authorLyonYao**/public…

大家好,又见面了,我是你们的朋友全栈君。

java中工厂模式在java ee中经常碰见,是一种常见的模式,其可分为三种:静态工厂模式、工厂方法模式、抽象工厂模式。一下做一简单讲述和例子。

静态工厂模式:顾名思义就知道他是用静态方法实现的,其创建的对象具有一定的特性,譬如说是某类的派生或者某接口的实现。其比较简单。例子如下

Animal类:package com.bean;

/**

* 动物类

* @author Lyon Yao

*

*/

public abstract class Animal {

private String name;

public Animal() {

super();

// TODO Auto-generated constructor stub

}

public Animal(String name) {

super();

this.name = name;

}

public abstract void eat();

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

猫类:package com.bean;

/**

* 猫类

* @author Lyon Yao

*

*/

public class Cat extends Animal {

public Cat() {

// TODO Auto-generated constructor stub

}

public Cat(String name) {

super(name);

// TODO Auto-generated constructor stub

}

@Override

public void eat() {

// TODO Auto-generated method stub

System.out.println(“I like to eat fish!”);

}

}

狗类:package com.bean;/**

* 狗类

* @author Lyon Yao

*

*/

public class Dog extends Animal {

public Dog() {

// TODO Auto-generated constructor stub

}

public Dog(String name) {

super(name);

// TODO Auto-generated constructor stub

}

@Override

public void eat() {

// TODO Auto-generated method stub

System.out.println(“I like to eat bone!”);

}

}

静态工厂类:package com.factory.sta;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

/**

* 静态工厂创建一个对象  静态工厂类产生的对象一般都有共同的特性,继承某一类,或者引用接口之类,在此

* 没有看似没有,但不可否认他们都是Object或者Object的一个子类

* @author Lyon Yao

*

*/

public class StaticFatory {

public static Object getInstance(String className){

Object instance=null;

try {

Class cls=Class.forName(className);

instance= cls.newInstance();

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InstantiationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return instance;

}

public static Object getInstance(String className,Object …agrs) {

Class cls=null;

try {

cls = Class.forName(className);

} catch (ClassNotFoundException e1) {

// TODO Auto-generated catch block

return null;

}

Constructor[] constructors = cls.getConstructors();

Object instance=null;

for(Constructor cons:constructors){

Class >[] clses=cons.getParameterTypes();

if(clses.length>0){

boolean isThisConstructor=true;

for(int i=0;i

Class c=clses[i];

if(! c.isInstance(agrs[i]) ){

isThisConstructor=false;

}

}

if(isThisConstructor){

try {

instance=cons.newInstance(agrs);

break;

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InstantiationException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}else{

continue;

}

}

}

return instance;

}

}

工厂方法模式:其主要是对各个类型的东西分类生产,但分类生产的对象仍然是具有某一特性的。譬如说:前面的静态工厂类是一个综合造车工厂,不管是汽车还是火车都能生产,而工厂方法模式就是工厂具体分工,造汽车的工厂只造汽车,造火车的只造火车,不管造汽车还是火车但造出来的还是车。

具体代码例子如下:(这里的例子和上面的例子是一起的,具狗生好多小狗,猫生好多小猫的例子,如果不具体那么是母动物都能生的)

母动物接口:package com.factory;

import com.bean.Animal;

/**

* 母亲接口

* @author Lyon

*

*/

public interface AnimalMother {

/**

* 生育动物

* @return

*/

public  Animal giveBirth();

}

母狗类:package com.factory.impl;

import com.bean.Animal;

import com.bean.Dog;

import com.factory.AnimalMother;

/**

* 狗母亲  生狗

* @author Lyon Yao

*

*/

public class DogMother implements AnimalMother {

@Override

public Animal giveBirth() {

// TODO Auto-generated method stub

Animal dog=new Dog();

System.out.println(“狗母亲生了一只小狗”);

return dog;

}

}

母猫类:package com.factory.impl;

import com.bean.Animal;

import com.bean.Cat;

import com.factory.AnimalMother;

/**

* 猫母亲 生猫咪

* @author Lyon Yao

*

*/

public class CatMother implements AnimalMother {

@Override

public Animal giveBirth() {

// TODO Auto-generated method stub

Animal cat=new Cat();

System.out.println(“猫母亲生了一只小猫眯”);

return cat;

}

}

抽象工厂模式:前面工厂方法模式是比较具体的,是猫肯定生的是小猫,这是不会有问题的,是具体的,那么抽象工厂它所产生的就不是那么具体,产生的对象可能是没有共同特性的。譬如说 一只奶羊不仅仅能够生小羊,同时也能生产羊奶,但小羊是动物,羊奶是食物。

例子如下:

总工厂:package com.factory;

import com.bean.Milk;

/**

* 能产奶的 动物母亲

* 这里继承 AnimalMother 实现 生育小动物  产奶在此接口声明 构成抽象工厂总接口

* @author Lyon Yao

*

*/

public interface MilkAnimalMother extends AnimalMother {

/**

* 产奶

* @return

*/

public Milk produceMilk();

}

奶羊:package com.factory.impl;

import com.bean.Animal;

import com.bean.Milk;

import com.bean.Sheep;

import com.bean.SheepMilk;

import com.factory.MilkAnimalMother;

/**

* 奶羊

* @author Lyon Yao

*

*/

public class SheepMilkMother implements MilkAnimalMother{

@Override

public Animal giveBirth() {

// TODO Auto-generated method stub

Animal sheep=new Sheep();

System.out.println(“奶羊生了一只小羊”);

return sheep;

}

@Override

public Milk produceMilk() {

// TODO Auto-generated method stub

Milk milk=new SheepMilk();

System.out.println(“奶羊生产了羊奶”);

return milk;

}

}

奶牛:package com.factory.impl;

import com.bean.Animal;

import com.bean.Cattle;

import com.bean.CattleMile;

import com.bean.Milk;

import com.factory.MilkAnimalMother;

/**

* 奶牛()

* @author Lyon Yao

*

*/

public class CattleMilkMother implements MilkAnimalMother {

@Override

public Animal giveBirth() {

// TODO Auto-generated method stub

Cattle cattle=new Cattle();

System.out.println(“奶牛生了一只小牛”);

return cattle;

}

@Override

public Milk produceMilk() {

// TODO Auto-generated method stub

Milk milk=new CattleMile();

System.out.println(“奶牛生产了牛奶”);

return milk;

}

}

下面是测试例子:package com.test;

import org.junit.Test;

import com.bean.Animal;

import com.bean.Cat;

import com.bean.Dog;

import com.factory.AnimalMother;

import com.factory.MilkAnimalMother;

import com.factory.impl.CatMother;

import com.factory.impl.CattleMilkMother;

import com.factory.impl.DogMother;

import com.factory.impl.SheepMilkMother;

import com.factory.sta.StaticFatory;

/**

* 测试类

*

* @author Lyon Yao

*

*/

public class TestCase {

/**

* 静态工厂类 测试

*/

@Test

public void staticFactoryTest() {

Animal ani1=(Animal) StaticFatory.getInstance(Cat.class.getName());

System.out.println(ani1.getName());

ani1.eat();

ani1=(Animal) StaticFatory.getInstance(Dog.class.getName(),”dog”);

System.out.println(ani1.getName());

ani1.eat();

}

/**

* 工厂方法模式测试

*/

@Test

public void methodFactoryTest(){

AnimalMother mother=new CatMother();

mother.giveBirth();

mother=new DogMother();

mother.giveBirth();

}

/**

* 抽象工厂模式测试

*/

@Test

public void abstrFactoryTest(){

MilkAnimalMother mother=new SheepMilkMother();

mother.giveBirth();

mother.produceMilk();

mother=new CattleMilkMother();

mother.giveBirth();

mother.produceMilk();

}

}

控制台输出:

null

I like to eat fish!

dog

I like to eat bone!

猫母亲生了一只小猫眯

狗母亲生了一只小狗

奶羊生了一只小羊

奶羊生产了羊奶

奶牛生了一只小牛

奶牛生产了牛奶

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162272.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月20日 上午7:46
下一篇 2022年7月20日 上午8:00


相关推荐

  • element-ui 表单组件的prop属性

    element-ui 表单组件的prop属性Vue 组件库 element ui 中的 Form 表单组件提供了表单验证功能通过 rules 属性传入验证规则 Form Item 中的 prop 属性设置需要校验的字段名如图所示 el form item 元素的 prop 属性绑定字段名 name 表单验证时 就会验证 el input 元素绑定的变量 ruleForm name 的值是否符合验证规则官方文档对表单属性 prop 的说明

    2026年3月17日
    2
  • mysql autoconf_autoconf手册(一)

    mysql autoconf_autoconf手册(一)AutoconfCreatingAutomaticConfigurationScriptsEdition2.13,forAutoconfversion2.13December1998byDavidMacKenzieandBenElliston—————————————————————–…

    2022年6月4日
    37
  • python和pycharm以及anaconda的安装顺序_症证病三者之间区别

    python和pycharm以及anaconda的安装顺序_症证病三者之间区别1、致欢迎词我将详细讲述在学Python初期的各种手忙脚乱的问题的解决,通过这些步骤的操作,让你的注意力集中在Python的语法上以及后面利用Python所解决的项目问题上。而我自己作为小白,很不幸的没有错过任何的坑,都跳了进去,所以在这里写下经验贴,一方面希望能给后来的学者能够高效的避开这些坑,另一方面也算是自己的总结与警告。2、内容大纲2.1安装顺序能够使用Python的安装…

    2022年8月28日
    4
  • Maven 打包命令

    Maven 打包命令cmd命令:–>跳过测试mvn clean -Dmaven.test.skip=true package -P prod运行:java-jarxxx.jarlinux下运行jarLinux运行jar包命令如下:方式一:java -jar XXX.jar特点:当前ssh窗口被锁定,可按CTRL+C打断程序运行,或直接关闭窗口,程序退出那如何让窗口不锁定?方式二:java -jar …

    2022年6月12日
    29
  • idea2021.5.3激活码[在线序列号]

    idea2021.5.3激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    226
  • sql中对嵌套查询的处理原则_sql的多表数据嵌套查询

    sql中对嵌套查询的处理原则_sql的多表数据嵌套查询在做嵌套查询时,如果嵌套的条件在另一张表中没有数据,则会报错。这时候可以用:

    2022年8月10日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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