GVKun编程网logo

java 设计模式,工厂,代理模式等(java的工厂设计模式)

2

想了解java设计模式,工厂,代理模式等的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于java的工厂设计模式的相关问题,此外,我们还将为您介绍关于java-设计模式、JavaJNDI与其他

想了解java 设计模式,工厂,代理模式等的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于java的工厂设计模式的相关问题,此外,我们还将为您介绍关于java - 设计模式、Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合、Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作、java – ZK:设计模式:寻找大量数据?的新知识。

本文目录一览:

java 设计模式,工厂,代理模式等(java的工厂设计模式)

java 设计模式,工厂,代理模式等(java的工厂设计模式)

javaEE 设计模式:

工厂模式:主要分为三种模式:

定义:在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。

为什么要使用工厂模式:

(1) 解耦 :把对象的创建和使用的过程分开
(2) 降低代码重复:如果创建某个对象的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
(3) 降低维护成本 :由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要找到所有需要创建对象 B 的地方去逐个修正,只需要在工厂里修改即可,降低维护成本。

1 简单工厂模式:

在实际的开发当中较少使用,主要在于违背了我们的开放 - 封闭原则,主要适用于创建对象较少,客户端不关心对象的创建过程方面。

主要的角色分配如下:

工厂 (Factory) 角色 : 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

抽象产品 (Product) 角色 : 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品 (Concrete Product) 角色: 简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。在这里不做赘述。

2 工厂方法模式

定义: 工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

主要的 UML 类图示例如下:


主要使用的工厂模式步骤如下:

1 创建抽象工厂类,定义具体工厂的公共接口

创建抽象产品类定义,具体产品的公共接口

3 创建具体产品类(继承抽象产品类) & 定义生产的具体产品;

4 创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;

5 最后,外界通过调用具体的工厂类的不同方法,从而创建不同的具体产品类的实例。

示例

创建抽象工厂类,定义具体工厂的公共接口:

abstract class Factory{
    public abstract Product Manufacture();
}

创建抽象产品类 ,定义具体产品的公共接口:

abstract class Product{
    public abstract void Show();
}

创建具体产品类,(继承抽象产品类),定义生产的具体产品:

//具体产品A类
class  ProductA extends  Product{
    @Override
    public void Show() {
        System.out.println("生产出了产品A");
    }
}

//具体产品B类
class  ProductB extends  Product{

    @Override
    public void Show() {
        System.out.println("生产出了产品B");
    }
}

创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法

//工厂A类 - 生产A类产品
class  FactoryA extends Factory{
    @Override
    public Product Manufacture() {
        return new ProductA();
    }
}

//工厂B类 - 生产B类产品
class  FactoryB extends Factory{
    @Override
    public Product Manufacture() {
        return new ProductB();
    }
}

外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例:

//生产工作流程
public class FactoryPattern {
    public static void main(String[] args){
        //客户要产品A
        FactoryA mFactoryA = new FactoryA();
        mFactoryA.Manufacture().Show();

        //客户要产品B
        FactoryB mFactoryB = new FactoryB();
        mFactoryB.Manufacture().Show();
    }
}

最终:生产出了产品 A, 生产出了产品 C.

工厂方法模式的优点:符合开闭原则,符合单一职责原则。可以形成基于继承的等级结构。

3 抽象工厂模式:

定义:抽象工厂模式,即 Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。(抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。)

 

1 创建抽象工厂类,定义具体工厂的公共接口
2 创建抽象产品族类 ,定义抽象产品的公共接口
3 创建抽象产品类 (继承抽象产品族类),定义具体产品的公共接口
4 创建具体产品类(继承抽象产品类) & 定义生产的具体产品
5 创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法
6 客户端通过实例化具体的工厂类,并调用其创建不同目标产品的方法创建不同具体产品类的实例
1 创建抽象工厂类,定义具体工厂的公共接口:
abstract class Factory{
   public abstract Product ManufactureContainer();
    public abstract Product ManufactureMould();
}

2 创建抽象产品族类 ,定义具体产品的公共接口:

abstract class AbstractProduct{
    public abstract void Show();
}

3 创建抽象产品类 ,定义具体产品的公共接口:

//容器产品抽象类
abstract class ContainerProduct extends AbstractProduct{
    @Override
    public abstract void Show();
}

//模具产品抽象类
abstract class MouldProduct extends AbstractProduct{
    @Override
    public abstract void Show();
}

4 创建具体产品类(继承抽象产品类), 定义生产的具体产品:

//容器产品A类
class ContainerProductA extends ContainerProduct{
    @Override
    public void Show() {
        System.out.println("生产出了容器产品A");
    }
}

//容器产品B类
class ContainerProductB extends ContainerProduct{
    @Override
    public void Show() {
        System.out.println("生产出了容器产品B");
    }
}

//模具产品A类
class MouldProductA extends MouldProduct{

    @Override
    public void Show() {
        System.out.println("生产出了模具产品A");
    }
}

//模具产品B类
class MouldProductB extends MouldProduct{

    @Override
    public void Show() {
        System.out.println("生产出了模具产品B");
    }
}

5 创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法:

//A厂 - 生产模具+容器产品
class FactoryA extends Factory{

    @Override
    public Product ManufactureContainer() {
        return new ContainerProductA();
    }

    @Override
    public Product ManufactureMould() {
        return new MouldProductA();
    }
}

//B厂 - 生产模具+容器产品
class FactoryB extends Factory{

    @Override
    public Product ManufactureContainer() {
        return new ContainerProductB();
    }

    @Override
    public Product ManufactureMould() {
        return new MouldProductB();
    }
}

6 客户端通过实例化具体的工厂类,并调用其创建不同目标产品的方法创建不同具体产品类的实例:

//生产工作流程
public class AbstractFactoryPattern {
    public static void main(String[] args){
        FactoryA mFactoryA = new FactoryA();
        FactoryB mFactoryB = new FactoryB();
        //A厂当地客户需要容器产品A
        mFactoryA.ManufactureContainer().Show();
        //A厂当地客户需要模具产品A
        mFactoryA.ManufactureMould().Show();

        //B厂当地客户需要容器产品B
        mFactoryB.ManufactureContainer().Show();
        //B厂当地客户需要模具产品B
        mFactoryB.ManufactureMould().Show();

    }
}

最后结果:

生产出了容器产品A
生产出了容器产品B
生产出了模具产品A
生产出了模具产品B

抽象工厂模式的优点:降低耦合。更符合开闭原则,符合单一职责原则,不使用静态工厂方法,可以形成基于继承的等级结构。

代理模式:

定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。通过引入代理对象的方式来间接访问目标对象

模式原理图:

 

 

示例如下:

1 创建抽象对象接口(Subject):声明你(真实对象)需要让代购(代理对象)帮忙做的事(买 Mac)

 
public interface Subject {  
              public void buyMac();
}

2 创建真实对象类(RealSubject), 即” 我 “。

public class RealSubject implement Subject{
    @Override
    public void buyMac() {  
        System.out.println(”买一台Mac“);  
    }  
}

3 创建代理对象类(Proxy),即” 代购 “,并通过代理类创建真实对象实例并访问其方法。

public class Proxy  implements Subject{
  
    @Override
    public void buyMac{
      
      //引用并创建真实对象实例,即”我“
      RealSubject realSubject = new RealSubject();

      //调用真实对象的方法,进行代理购买Mac
      realSubject.buyMac();
      //代理对象额外做的操作
      this.WrapMac();
    }

     public void WrapMac(){
      System.out.println(”用盒子包装好Mac“);  
    }
}

4 客户端调用

public class ProxyPattern {

    public static void main(String[] args){

    Subject proxy = new Proxy();
    proxy.buyMac();
    }
        
}

上述过程就实现了一般的代理模式的实现。 实现优点:

1 协调调用者和被调用者,降低了系统的耦合度

2 代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用

 

 
 
 
 
 

java - 设计模式

java - 设计模式

设计模式是一种设计思想,解决方案,经验总结。

java的设计模式大体上分为三大类:

  • 创建型模式(5种): 用于解决结局对象创建
  • 单例模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式。
  • 结构型模式(7种):把类和对象结合在一起,构成复杂结构
  • 适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
  • 行为型模式(11种): 解决类或对象之间的交互,优化类或者对象之间的关系
  • 观察者模式、策略模式、模板方法模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

 

1. 单例模式(Singleton)

如果一个类中只有方法会被大量使用,没必要每次都创建一个新实例,只创建一个实例,每次都调用这个实例的方法就可以 

 让一个类只创建一个对象。

package xiushifu.singleton;

//如果一个类中只有方法会被大量使用,没必要每次都创建一个新实例,只创建一个实例,每次都调用这个实例的方法就可以 
//让一个类只创建一个对象。
//在内部创建一个实例,构造器全部设置为private,所有方法均在该实例上改动,在创建上要注意类的实例化只能执行一次,可以采用许多种方法来实现,如Synchronized关键字,或者利用内部类等机制来实现。

//1.让构造方法变成私有
//2.通过static控制创建
public class Singleton {

    private Singleton(){}//将构造方法变为私有,不能通过外部随意创建

    //饿汉式
    private static Singleton singleton = new Singleton();  //static 表示所有实例的这个变量都被存在一个空间内,每次修改都会覆盖掉之前的值,保证了实例只有一个。

    public static Singleton newInstance(){ //可以通过class直接调用。

        return singleton;   //因为属性也是私有的,所以需要一个公有方法来获取。
    }

    //懒汉式   使用这种则不能直接在class里直接用this.singleton了,否则会空指针。
//    private static Singleton singleton;  //static 表示所有实例的这个变量都被存在一个空间内,每次修改都会覆盖掉之前的值,保证了实例只有一个,不直接创建实例,需要时再创建。
//
//    public static Singleton newInstance(){ //可以通过class直接调用。
//        if(singleton == null){  //判断之前是否被调用过,如果是第一次则创建实例
//            singleton = new Singleton();
//        }
//        return singleton;   //因为属性也是私有的,所以需要一个公有方法来获取。
//    }


    public static void main(String[] args) {
//        Singleton.singleton就是一个初始化完毕的实例,它是属于类的,这样保证了只有一个。
        Singleton s1 = Singleton.singleton;//因为属性是private,所以这种写法只能在本类中使用
        Singleton s2 = Singleton.singleton;
        System.out.println(s1 == s2);//判断s1和s2的内存地址hashcode值是否一致。   返回一个16进制数字
        System.out.println(s1.equals(s2));//底层代码其实和s1==s2一样

        Singleton s3 = Singleton.newInstance();//可以在外部类中使用,和上面效果一样
        Singleton s4 = Singleton.newInstance();
        System.out.println(s3 == s4);
        System.out.println(s1 == s3);
    }
}

 

分享图片

 

共有方法返回单例对象:

饿汉式:立即加载   启动项目就已经加载了,所以可能会浪费空间,不会产生空指针。  上面的是饿汉式

懒汉式:延迟加载   用到了才会加载,可能会异常,用到了才会加载(在public方法中new)不会浪费空间。   

生命周期托管:其他对象处理

Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合

Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合

java jndi 与其他 java 技术的协作:揭秘 java jndi 与 java ee 等技术的融合

Java JNDI 简介

Java JNDI(Java Naming and Directory Interface)是Java中用于访问命名和目录服务的API,与Java EE等技术的协作至关重要。在实际开发中,Java JNDI可以与Java EE框架无缝融合,为应用程序提供更灵活的资源访问方式。本文将深入探讨Java JNDI与其他Java技术的协作,揭示它们之间的关联与互补,帮助开发者更好地理解和应用这些技术。

Java JNDI 与 Java EE 的协作

Java JNDI与Java EE有着密切的协作,在Java EE应用程序中扮演着重要的角色。Java EE规范中定义了JNDI作为标准的命名和目录服务API,Java EE应用程序可以通过JNDI来访问各种命名和目录服务中的数据。

JNDI在Java EE中的应用

在Java EE应用程序中,JNDI主要用于以下几个方面:

  • 资源查找: Java EE应用程序可以使用JNDI来查找各种资源,如数据源、消息队列、EJB组件等。这些资源通常由应用程序服务器管理,Java EE应用程序可以通过JNDI来访问这些资源,而无需关心资源的具体位置和访问方式。
  • 服务发现: Java EE应用程序可以使用JNDI来发现其他服务,如WEB服务、EJB组件等。这些服务通常由应用程序服务器注册,Java EE应用程序可以通过JNDI来查找这些服务,并与之通信。
  • 命名空间管理: Java EE应用程序可以使用JNDI来管理命名空间,如全局JNDI命名空间和Web应用程序JNDI命名空间等。Java EE应用程序可以通过JNDI来创建、修改和删除命名空间中的对象,并访问命名空间中的对象。

Java JNDI与Java EE的集成

Java JNDI与Java EE的集成主要通过以下几个方面来实现:

立即学习“Java免费学习笔记(深入)”;

  • Java EE应用程序服务器: Java EE应用程序服务器通常提供了一个JNDI服务,用于管理命名空间和资源。Java EE应用程序可以通过JNDI服务来查找资源和服务。
  • Java EE规范: Java EE规范中定义了JNDI作为标准的命名和目录服务API。Java EE应用程序可以使用JNDI来访问各种命名和目录服务中的数据。
  • JNDI API: Java JNDI API提供了一组丰富的类和接口,用于访问命名和目录服务中的数据。Java EE应用程序可以通过JNDI API来实现资源查找、服务发现和命名空间管理等功能。

Java JNDI 与其他 Java 技术的协作

除了Java EE之外,Java JNDI还与其他Java技术有着密切的协作,如Java RMI、Java CORBA、Java Servlet等。

Java JNDI与Java RMI的协作

Java JNDI与Java RMI(Remote Method Invocation)协作,使Java程序能够通过网络调用远程对象的方法。Java RMI中,远程对象可以注册到JNDI命名空间中,其他Java程序可以通过JNDI来查找远程对象,并调用远程对象的方法。

Java JNDI 与 Java CORBA 的协作

Java JNDI 与 Java CORBA(Common Object Request Broker Architecture)协作,使Java程序能够与其他语言(如c++C#等)编写的 CORBA 对象进行通信。Java CORBA 对象可以注册到 JNDI 命名空间中,其他 Java 程序或其他语言编写的 CORBA 程序可以通过 JNDI 来查找 CORBA 对象,并调用 CORBA 对象的方法。

Java JNDI 与 Java Servlet 的协作

Java JNDI 与 Java Servlet 协作,使 Servlet 能够访问各种资源,如数据源、消息队列等。Servlet 可以通过 JNDI 来查找资源,并使用这些资源。

总结

Java JNDI 作为 Java 平台上通用的命名和目录服务 API,不仅与 Java EE 有着密切的协作,还与其他 Java 技术(如 Java RMI、Java CORBA、Java Servlet 等)有着密切的协作。在项目开发中,Java JNDI 发挥着重要的作用,帮助 Java 程序员轻松地访问和操纵命名和目录服务中的数据,实现资源查找、服务发现和命名空间管理等功能。

>软考高级考试备考技巧/历年真题/备考精华资料" target="_blank">点击免费下载>>软考高级考试备考技巧/历年真题/备考精华资料

以上就是Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合的详细内容,更多请关注php中文网其它相关文章!

Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作

Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作

java jndi 与其他 java 框架的兼容性:解析 java jndi 与其他 java 框架的兼容性和协作

Java JNDI 作为 Java 开发中常用的技术,与其他 Java 框架的兼容性一直备受关注。本文从实际应用出发,深入解析了 Java JNDI 与其他 Java 框架的兼容性及协作方式,为开发者提供了全面的指导和解决方案。通过分析不同框架之间的特点和使用方法,帮助开发者更好地理解和运用 Java JNDI 技术,提升开发效率和代码质量。

  • 名称空间集成: JNDI 提供了一个统一的名称空间视图,允许开发人员使用 JNDI 名称来访问各种命名和目录服务中的对象。这使得开发人员能够轻松地将应用程序连接到多个命名和目录服务,而无需担心底层技术细节。
  • 命名服务集成: JNDI 提供了一个统一的接口来访问各种命名服务,例如 LDAP、DNS 和 RMI 注册表。这使得开发人员能够轻松地将应用程序连接到多个命名服务,而无需担心底层的技术细节。
  • 目录服务集成: JNDI 提供了一个统一的接口来访问各种目录服务,例如 LDAP 和 Active Directory。这使得开发人员能够轻松地将应用程序连接到多个目录服务,而无需担心底层的技术细节。
  • 命名对象集成: JNDI 提供了一个统一的接口来访问各种命名对象,例如文件、数据库表和 Java 对象。这使得开发人员能够轻松地将应用程序连接到多个命名对象,而无需担心底层的技术细节。
  • 安全集成: JNDI 提供了一个统一的接口来访问各种安全服务,例如认证和授权。这使得开发人员能够轻松地将应用程序连接到多个安全服务,而无需担心底层的技术细节。

以下是一些演示代码,展示了 JNDI 如何与其他 Java 框架集成:

JNDI 与 LDAP 的集成

import javax.naming.Context;
import javax.naming.InitialContext;

public class JndiLdapExample {

public static void main(String[] args) {
try {
// Create a JNDI context
Context context = new InitialContext();

// Look up the LDAP server
Context ldapContext = (Context) context.lookup("ldap://localhost:389");

// Search the LDAP server for a user
String searchFilter = "(cn=John Doe)";
NamingEnumeration<SearchResult> searchResults = ldapContext.search("", searchFilter, null);

// Print the results of the search
while (searchResults.hasMore()) {
SearchResult searchResult = searchResults.next();
System.out.println(searchResult.getName());
}

} catch (NamingException e) {
e.printStackTrace();
}
}
}
登录后复制

JNDI 与 DNS 的集成

立即学习“Java免费学习笔记(深入)”;

import javax.naming.Context;
import javax.naming.InitialContext;

public class JndiDnsExample {

public static void main(String[] args) {
try {
// Create a JNDI context
Context context = new InitialContext();

// Look up the DNS server
Context dnsContext = (Context) context.lookup("dns://localhost:53");

// Resolve a hostname to an IP address
String hostname = "www.example.com";
String ipAddress = dnsContext.resolve(hostname).toString();

// Print the IP address
System.out.println(ipAddress);

} catch (NamingException e) {
e.printStackTrace();
}
}
}
登录后复制

JNDI 与 RMI 的集成

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Reference;
import java.rmi.Remote;

public class JndiRmiExample {

public static void main(String[] args) {
try {
// Create a JNDI context
Context context = new InitialContext();

// Create a reference to the RMI object
Reference reference = new Reference(Remote.class.getName(), "com.example.rmi.RemoteImpl", null);

// Bind the reference to the JNDI context
context.bind("rmi://localhost:1099/Remote", reference);

// Look up the RMI object from the JNDI context
Remote remoteObject = (Remote) context.lookup("rmi://localhost:1099/Remote");

// Invoke a method on the RMI object
String result = remoteObject.toString();

// Print the result
System.out.println(result);

} catch (NamingException e) {
e.printStackTrace();
}
}
}
登录后复制

JNDI 与其他 Java 框架的兼容性和协作是其成功的关键因素之一。它使开发人员能够轻松地将应用程序连接到各种命名和目录服务,并利用这些服务的特性和功能来构建强大的、可扩展的应用程序。

>软考高级考试备考技巧/历年真题/备考精华资料" target="_blank">点击免费下载>>软考高级考试备考技巧/历年真题/备考精华资料

以上就是Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作的详细内容,更多请关注php中文网其它相关文章!

java – ZK:设计模式:寻找大量数据?

java – ZK:设计模式:寻找大量数据?

我想就如何处理大量数据的分页和排序提出一些建议.

目前,我检索所有用户数据并将其粘贴在列表框中.这是非常好的,但是当我们有10万用户时,我不想填充有10万用户的列表框,也不希望在服务器上有10万用户的集合.

你会推荐一个很好的方法来做到这一点?

我应该保留ConnectedRecordset并将其传递给列表框. ZK是否有能力管理数据和连接?

〜或〜

手动查找页面事件是否更好,并使用第二组数据重新填充列表框,一次只拉10行?

此外,当我想允许用户按列排序时,肯定需要重新查询数据库中的数据.

挑战这个的正确方法是什么?请提供建议或文章链接.

谢谢,

标记

解决方法

您可以查看 Sorting huge data using ZK和 Handling huge data using ZK的教程

我们今天的关于java 设计模式,工厂,代理模式等java的工厂设计模式的分享就到这里,谢谢您的阅读,如果想了解更多关于java - 设计模式、Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合、Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作、java – ZK:设计模式:寻找大量数据?的相关信息,可以在本站进行搜索。

本文标签: