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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Nginx搭建视频点播和视频直播服务器[通俗易懂]

    Nginx搭建视频点播和视频直播服务器[通俗易懂]Nginx搭建视频点播和视频直播服务器一·、环境:Centos7,(推荐,Ubuntu不是很好用,经常会有一些莫名其妙的报错)Nginx1.10.1二、系统环境搭建首先,我是不建议自己一个个去安装这些软件的,耗时耗力,而且,容易出错,所以,最好使用yuminstall***命令安装,出错的概率小。资源链接:链接:https://pan.baidu.com/s/1WmJYpQ_b…

    2022年6月14日
    35
  • nginx设置301永久重定向

    nginx设置301永久重定向

    2021年10月27日
    38
  • 美股实时行情api接口(美股开户)

    所有美股历史交易行情数据,完整历史交易/任意时间段查询。1.产品功能支持所有历史美股交易查询;支持指定任意时间段查询;超高的查询效率,秒级返回;所有的交易数据为未复权的数据;全接口支持HTTPS(TLSv1.0/v1.1/v1.2/v1.3);全面兼容AppleATS;全国多节点CDN部署;接口极速响应,多台服务器构建API接口负载均衡。2.API文档接口地址:https://api.gugudata.com/stock/us返回格式:

    2022年4月11日
    135
  • pycharm企业版激活码【2022最新】2022.01.22

    (pycharm企业版激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1TCF2R91JZ-eyJsaWNlbnNlSWQiOi…

    2022年3月31日
    82
  • lstm是rnn中的一种吗_经验公式是什么

    lstm是rnn中的一种吗_经验公式是什么前言好久没用正儿八经地写博客了,csdn居然也有了markdown的编辑器了,最近花了不少时间看RNN以及LSTM的论文,在组内『夜校』分享过了,再在这里总结一下发出来吧,按照我讲解的思路,理解RNN以及LSTM的算法流程并推导一遍应该是没有问题的。RNN最近做出了很多非常漂亮的成果,比如AlexGraves的手写文字生成、名声大振的『根据图片生成描述文字』、输出类似训练语料的文字等应用,都让人感

    2022年8月29日
    1
  • Mac 安装Yarn「建议收藏」

    Mac 安装Yarn「建议收藏」前言近期学习ant-design-vue-pro,需要使用Yarn安装相关依赖包,以下说说在Mac上安装Yarn的尝试几种安装方式使用homebrew安装brewinstallyarn等待许久后,得到如下错误,尝试无数次后放弃,建议在良好的网络环境下尝试脚本安装curl-o–Lhttps://yarnpkg.com/install.sh|bash安装截图:简单快速,强烈建议尝试,尤其适用在国内网络环境下适用。总结homebrew适宜在网络环境良好的情况下使

    2022年5月26日
    34

发表回复

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

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