设计模式-工厂方法模式(代码片段)

shoulinniao shoulinniao     2023-05-07     389

关键词:

工厂方法模式:又称工厂模式,也叫虚拟构造器模式或者多态工厂模式,属于类创建型模式。

在这个模式中,有4个角色

1.抽象工厂

在抽象工厂类中,声明了工厂方法,用于返回一个产品。是整个模式的核心,它与应用程序无关。任何在模式中创建对象的工厂类都必须实现该接口。

2.具体工厂

是抽象工厂类的子类,实现了父类中的工厂方法。由客户调用,返回具体产品。

3.抽象产品

抽象产品是定义产品的接口,是所有产品的共同父类或者接口。

4.具体产品

实现抽象产品接口,由专门的具体工厂创建。一个具体产品只能由某一个具体工厂创建,一一对应。优点:用户只需要关心所需产品的工厂,无需知道其他细节,添加时不需要改动原来的代码,只需要增加具体工厂和具体产品类。也体现了缺点:每多一个具体产品,需要多写一个具体产品类和一个具体工厂类。

举例:

有抽象产品类 电视机,具体产品 海尔电视机和海信电视机。

有抽象工厂类 生产电视机制造厂,具体工厂 海尔制造厂和海信制造厂。

技术图片
package factory;

public abstract class TV
    public abstract void play();
//TV作为抽象产品类,可以是接口或者抽象类。包含了所有产品都具有的业务方法play()
TV.java
技术图片
package factory;

public interface TVFactory
    public TV produceTV();
//抽象工厂类,可以是接口或者抽象类,包含了抽象的工厂方法produceTV(),返回抽象产品TV类型的对象
TVFactory.java
技术图片
package factory;

public class HaierTV extends TV
    public void play() 
        System.out.println("具体产品类海尔电视机");
    
HaierTV.java
技术图片
package factory;

public class HisenseTV extends TV
    public void play() 
        System.out.println("具体产品类海信电视机");
    
HisenseTV.java
技术图片
package factory;

public class HaierTVFactory implements TVFactory
    public TV produceTV() 
        System.out.println("海尔工厂 生产 海尔电视机");
        return new HaierTV();
    
HaierTVFactory.java
技术图片
package factory;

public class HisenseTV extends TV
    public void play() 
        System.out.println("具体产品类海信电视机");
    
HisenseTV.java
技术图片
<?xml version="1.0"?>
<config>
    <className>HaierTVFactory</className>
</config>
TV.xml
 1 package factory;
 2 
 3 import javax.xml.parsers.*;
 4 import org.w3c.dom.*;
 5 import java.io.*;
 6 import java.net.URL;
 7 
 8 public class XMLUtil 
 9     
10     public static Object getBean() 
11         try 
12             //创建DOM文档对象
13             DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();//文档制造者工厂创建了一个 文档制造者工厂对象
14             DocumentBuilder builder=dFactory.newDocumentBuilder();//文档制造者类 通过 文档制造者工厂 创造一个 文档制造者对象
15             Document doc;//文档制造者 创建 文档
16             doc=builder.parse(new File("src/factory/TV.xml"));//解析xml文件
17             
18             //获取包含类名的文本节点
19             NodeList nl=doc.getElementsByTagName("className");//文本节点列表里有很多被className标签夹着的内容
20             Node classNode=nl.item(0).getFirstChild();
21             //item(0)表示引用列表里第一个节点,这里只有一个。getFirstChild表示获取该节点的第一个孩子。
22             String cName=classNode.getNodeValue();
23 
24             //通过类名生成实例对象并返回,cName=HaierTVFactory
25             Class c=Class.forName("factory." + cName);
26             Object obj=c.newInstance();
27             return obj;
28         catch(Exception e) 
29             e.printStackTrace();
30             return null;
31         
32     
33 
技术图片
 1 package factory;
 2 
 3 public class Client 
 4 
 5     public static void main(String[] args) 
 6         try     
 7             TV tv;
 8             TVFactory factory;
 9             factory=(TVFactory)XMLUtil.getBean();//getBean返回类型为Object,此处需要强转
10             tv=factory.produceTV();//多态:父类栈变量 引用(指向)子类对象
11             tv.play();        
12         catch(Exception e) 
13             System.out.println(e.getMessage());
14         
15     
16 
Client.java

输出:

海尔工厂 生产 海尔电视机
具体产品类海尔电视机

 

包里各文件和路径:

技术图片

 

Java反射是指程序运行时获取已知名称的类或已有对象的相关信息的一种机制,包括类的方法、属性、超类等信息,还包括实例的对象和实例类型的判断等。在反射中使用最多的类是Class,Class类的实例表示正在运行的Java应用程序中的类和接口,其forName(String className)方法可以返回与 带有给定字符串名的类或接口 相关联的Class对象,再通过Class对象的newInstance()方法创建此对象所表示的类的一个新实例,即通过一个类名字符串得到类的实例

技术图片
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
套路

 

设计模式---工厂模式(代码片段)

工厂模式简单工厂模式介绍角色简单工厂模式深入分析:代码演示优点缺点适用场景参考文章工厂方法模式介绍角色工厂方法模式深入分析代码演示工厂方法模式总结工厂方法模式的主要优点工厂方法模式的主要缺点适用场... 查看详情

设计模式——抽象工厂模式(代码片段)

设计模式(七)——抽象工厂模式在设计模式(五)——工厂方法模式和设计模式(六)——JDK中的那些工厂方法中介绍了工厂方法模式。本文将介绍另外一种工厂模式——抽象工厂模式。工厂模式的简单回顾在介绍了简单工厂... 查看详情

设计模式之工厂方法模式(代码片段)

1.什么是工厂方法模式工厂方法模式同样属于类的创建型模式又被称为多态工厂模式。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成... 查看详情

设计模式——工厂方法模式(代码片段)

1.抽象工厂定义为创建一组相关或相互依赖的对象提供接口,无需找出具体类。抽象工厂模式与工厂方法模式的区别抽象工厂是工厂方法模式的升级,用它来创建一组相关或相互依赖的对象,他与工厂方法模式的区别就在于,工... 查看详情

工厂模式(代码片段)

...做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特... 查看详情

设计模式——工厂方法(代码片段)

工厂方法模式简介工厂方法模式(FactoryMethodPattern)又被称为工厂模式,也叫虚构造器(VirtualConstructor)模式或多态工厂(PolymorphicFactory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义一个用于创建产品对象的公共... 查看详情

设计模式之工厂方法模式(代码片段)

工厂方法模式工厂方法模式介绍工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式... 查看详情

设计模式——工厂方法模式(代码片段)

设计模式(五)——工厂方法模式新专题:设计模式,我会在博客(http://www.hollischuang.com)及微信公众号(hollischuang)同步更新,欢迎共同学习。在设计模式(四)——简单工厂模式文章中介绍了简单工厂模式,通过一个例子讲述了... 查看详情

设计模式工厂方法模式(简介|适用场景|优缺点|代码示例)(代码片段)

文章目录一、工厂方法模式简介二、工厂方法模式适用场景三、工厂方法模式优缺点四、工厂方法模式代码示例1、产品抽象类2、产品实现类13、产品实现类24、抽象工厂类5、实现工厂类16、实现工厂类27、测试类五、扩展上述工... 查看详情

设计模式之工厂方法模式(代码片段)

设计模式之工厂方法模式(一)什么是工厂方法模式  工厂方法模式也称为多态工厂模式,也是对象的创建模式。定义了一个创建产品对象的工厂接口或抽象类,将实际创建工作推迟到它的实现类或子类当中。核心工厂类不再... 查看详情

设计模式-工厂方法模式(代码片段)

...承的等级结构。为了解决上述的问题,我们学习一种新的设计模式:工厂方法模式。模式定义定义一个用于创建对象的接口,让子类决定实例化哪一个 查看详情

设计模式-简单工厂工厂方法模式抽象工厂模式详解(代码片段)

工厂方法模式概要一个抽象产品类多个具体产品类一个抽象工厂多个具体工厂-每一个具体产品对应一个具体工厂符合-OCP开放封闭原则优点降低了代码耦合度,对象的生成交给子类去完成实现了开放封闭原则-每次添加子产品不需... 查看详情

设计模式-工厂方法模式(go实现)(代码片段)

目录工厂方法模式需求修改前简单工厂设计代码修改后工厂方法设计代码测试测试代码结果总结适用场景优点缺点参考工厂方法模式定义一个用于创建对象的接口,让子类决定将哪一个类实例化。不再提供一个统一的工厂类... 查看详情

设计模式——jdk中的那些工厂方法(代码片段)

设计模式(六)——JDK中的那些工厂方法新专题:设计模式,我会在博客(http://www.hollischuang.com)及微信公众号(hollischuang)同步更新,欢迎共同学习。在设计模式(五)——工厂方法模式中介绍了工厂方法模式。本文通过介绍JDK源... 查看详情

java设计模式——工厂模式简单工厂模式工厂方法模式抽象工厂模式(代码片段)

目录简单工厂模式传统方式简单工厂模式静态工厂模式工厂方法模式抽象工厂模式工厂模式JDK-Calendar源码分析工厂模式小结简单工厂模式 看一个具体的需求看一个披萨的项目:要便于披萨种类的扩展,要便于维护(1)... 查看详情

设计模式之工厂方法模式(代码片段)

设计模式之工厂方法模式  工厂方法模式定义:Defineaninterfaceforcreatinganobject,butletsubclassesdecidewhichclasstoinstantiate.FactoryMethodletsaclassdeferinstantiationtosubclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类 查看详情

工厂方法模式(代码片段)

1工厂模式介绍  1.1定义:定义一个用于创建对象的接口,让子类绝对实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。  工厂方法模式通用类图:  在工厂模式中,抽象产品类Product负责定义产品的共性,实现... 查看详情

简单工厂模式&工厂方法模式&抽象工厂模式的区别(代码片段)

...为简略。这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个设计模式,但很多地方都用到了工厂模式,(如解析xml中,jdbc连接数据库等)利用好工厂模式对程序的设计很有用处。工厂模式在一些设计模式... 查看详情