Java设计模式之工厂模式

摘要:
前言工厂模式在项目中得到了广泛应用。显示了以下代码:1publicclassHumanFactoryeextendsAbstractHumanFactory{2@Override3publicTcreateHuman{4Humanhuman=null;5try{6human=Class.forName.newInstance();7}catch{89}10 returnhuman;11} 12}最后,我们添加了一个场景类Client:publicclassClient{publicstaticvoidmain{AbstractHumanFactoryhumanFactory=newHumanFactory();BlackHumanblackHuman=humanFactory.createHuman;blackHuman.getColor();blackHuman.talk();WhiteHumanwhiteHuman=human Factor.createHuman; 黄色人类。talk();}}跑步结果如下:我是黑人,我是黑人和黑人,我黄色和黄色,我会说话。工厂模式的定义是定义用于创建对象的接口,并让子类决定实例化哪个类。它还具有工厂接口和特定的工厂实现。这减少了模块之间的耦合。这符合设计原则中的打开和关闭原则。③ 抽象工厂类1packagecom。实例图案工厂总结;23 publicinterfaceIFactory{45public<TextendsAbstractProduct>TcreateProduct;67}抽象工厂类可以定义为接口或抽象类。

前言

      工厂模式在项目中被广泛的使用。使用设计模式,可以让很复杂的业务用简单的代码表达出来。

工厂模式的概述

      首先我们举个栗子来说明,在相传的神话中,最早的一批人类是通过女娲造人来产生的,女娲就是一个客户端的调用方,也是场景的执行者。黄色人种,白色人种,黑色人种就是要产生的产品。即工厂中的产品。

我们再来定义一个抽象工厂用来生成产品。示意代码如下所示:

1 public abstract class AbstractHumanFactory {
2 
3     public abstract <T extends Human> T createHuman(Class<T> c);
4 }

其中入参是人类的类型,出参是对应的人类。接下来我们来定义一下具体的人类。首先新增一个人类的抽象接口以及具体的三种肤色的人类,如下代码示意:

1 public interface Human {
2 
3     public void getColor();
4 
5     public void talk();
6 }
 1 public class BlackHuman implements Human {
 2     @Override
 3     public void getColor() {
 4 
 5         System.out.println("我是黑人");
 6 
 7     }
 8 
 9     @Override
10     public void talk() {
11         System.out.println("黑人会说话");
12     }
13 }
 1 public class WhiteHuman implements Human {
 2     @Override
 3     public void getColor() {
 4         System.out.println("我是白人");
 5 
 6     }
 7 
 8     @Override
 9     public void talk() {
10         System.out.println("白人会说话");
11 
12     }
13
public class YellowHuman implements Human {
    @Override
    public void getColor() {
        System.out.println("我是黄人");

    }

    @Override
    public void talk() {
        System.out.println("黄人会说话");

    }
}

 最后我们新增一个抽象工程的具体工厂方法。如下代码所示:

 1 public class HumanFactory extends AbstractHumanFactory {
 2     @Override
 3     public <T extends Human> T createHuman(Class<T> c) {
 4         Human human = null;
 5         try {
 6            human =  (T)Class.forName(c.getName()).newInstance();
 7         } catch (Exception e) {
 8 
 9         }
10         return (T)human;
11     }
12 }

 最后我们新增一个场景类Client:

public class Client {


    public static void main(String[] args) {

        AbstractHumanFactory humanFactory = new HumanFactory();

        BlackHuman blackHuman = humanFactory.createHuman(BlackHuman.class);
        blackHuman.getColor();
        blackHuman.talk();

        WhiteHuman whiteHuman = humanFactory.createHuman(WhiteHuman.class);
        blackHuman.getColor();
        blackHuman.talk();

        YellowHuman yellowHuman = humanFactory.createHuman(YellowHuman.class);
        yellowHuman.getColor();
        yellowHuman.talk();


    }
}

 运行结果如下所示:

我是黑人
黑人会说话
我是黑人
黑人会说话
我是黄人
黄人会说话

 工厂模式的定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到子类。

总结一下,在工程模式中,我们拥有客户端,也就是调用方。同时拥有工厂接口和具体的工厂实现。另外还包含产品接口和具体产品。

1.采用工厂模式,只要客户端知道要产生什么产品整套链路就确认下来了,无须知晓产品产生的细节。这降低了模块之间的耦合。

2.当增加一个产品,只需要实现产品接口即可,工厂类不需要任何的变动。这符合设计原则中的开闭的原则。对修改关闭,对扩展开放。

最后我们再来总结一下工厂模式的通用实现方式:

①首先我们需要有抽象产品类,同时拥有公共的方法prepare();以及抽象的处理方法handle();

 1 package com.example.pattern.factory.summary;
 2 
 3 public abstract class AbstractProduct {
 4 
 5     public void prepare() {
 6 
 7     }
 8 
 9 
10     public abstract void handle();
11 }

②需要有具体的产品类,这些产品类继承了抽象产品类,重写的handle抽象方法。

 1 package com.example.pattern.factory.summary;
 2 
 3 public class ConcreteProductFirst extends AbstractProduct {
 4 
 5 
 6     @Override
 7     public void handle() {
 8 
 9     }
10 }

这样的产品类可以有多个,主要用来负责产品的产生,但是要保证这个产品是一个具体的产品。

③抽象工厂类

1 package com.example.pattern.factory.summary;
2 
3 public interface IFactory {
4     
5     public <T extends AbstractProduct> T createProduct(Class<T> clazz) ;
6     
7 }

抽象工厂类可以定义为接口,也可以定义为抽象类。在实际中可以采用定义一个接口,一个抽象类实现这个接口,把公共的实现方法抽取到抽象类中实现,具体的工厂类再去继承这个抽象工厂。

④具体工厂类

 1 package com.example.pattern.factory.summary;
 2 
 3 public class ConcreteFactory implements IFactory {
 4     @Override
 5     public <T extends AbstractProduct> T createProduct(Class<T> clazz) {
 6 
 7         AbstractProduct product = null;
 8 
 9         try {
10             product = (AbstractProduct)Class.forName(clazz.getName()).newInstance();
11         } catch (Exception e) {
12 
13         }
14 
15         return (T)product;
16     }
17 }

⑤业务场景类

 1 package com.example.pattern.factory.summary;
 2 
 3 public class Client {
 4 
 5     public static void main(String[] args) {
 6         IFactory factory = new ConcreteFactory();
 7 
 8         ConcreteProductFirst product = factory.createProduct(ConcreteProductFirst.class);
 9         product.handle();
10 
11     }
12 }

以上代码是工厂模式的通用写法,在实际应用中可以适当调整,或者和其他的设计模式混合使用。

免责声明:文章转载自《Java设计模式之工厂模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux内核学习笔记八——定时器和时间管理c#之Redis实践list,hashtable下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java 设计模式--策略模式,枚举+工厂方法实现

项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改 一、什么是策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决多重If判断问题。 1.环境(Context)角色:持有一个Strategy的引用。 2.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象...

接口和简单工厂设计模式

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 接口: 接口就是纯抽象类的演变,实现接口的类都必须实现接口的的方法。接口里全部都是方法的声明,没有方法的实现。接口里的方法都是public修饰的,就算不写public关键字,也是默认public的,里面的申请的属性 全...

浅析设计模式

  一、什么是设计模式? 设计模式,是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。 Christo...

消息中间件系列三:使用RabbitMq原生Java客户端进行消息通信(消费者(接收方)自动确认模式、消费者(接收方)自行确认模式、生产者(发送方)确认模式)

准备工作: 1)安装RabbitMQ,参考文章:消息中间件系列二:RabbitMQ入门(基本概念、RabbitMQ的安装和运行) 2.)分别新建名为OriginalRabbitMQProducer和OriginalRabbitMQConsumer的maven工程 在pom.xml文件里面引入如下依赖: <dependency>...

设计模式(2)

上一篇日志、我们应用到了设计模式三大特性的封装、今天这一片我们继续研究程序设计的另几种比较优秀的特性。 在上面的程序中这款计算器只涉及了加、减、乘、除算法、现在我们要加一个平方根运算,我们的思路会是改动我们的计算类,在switch中加一个分支就行了,但是这样的话要让加减乘除的运算都得来参与编译,如果你一不小心,把加法运算改成了减法,这岂不是大大的糟糕。这还...

c# 工厂模式 ,委托 ,事件。

有些时间 不用 c#了 ,想 写 委托 和 事件 又会 卡下 ,之前也没认真总结过。干脆 做个小结 。 什么是委托:狭义,不安全函数的指针。不安全在哪里: 任何地方都可以调用委托对象。(实际上委托对象才是函数的指针,而delegate只是一个语法) 什么是事件:狭义,安全的函数指针,安全在哪里:只允许包含事件的类,的内部调用。 联系和区别: delegat...