想了解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 JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合
- Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作
- java – ZK:设计模式:寻找大量数据?
java 设计模式,工厂,代理模式等(java的工厂设计模式)
javaEE 设计模式:
工厂模式:主要分为三种模式:
定义:在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。
为什么要使用工厂模式:
(1) 解耦 :把对象的创建和使用的过程分开
(2) 降低代码重复:如果创建某个对象的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
(3) 降低维护成本 :由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要找到所有需要创建对象 B 的地方去逐个修正,只需要在工厂里修改即可,降低维护成本。
1 简单工厂模式:
在实际的开发当中较少使用,主要在于违背了我们的开放 - 封闭原则,主要适用于创建对象较少,客户端不关心对象的创建过程方面。
主要的角色分配如下:
工厂 (Factory) 角色 : 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
抽象产品 (Product) 角色 : 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品 (Concrete Product) 角色: 简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。在这里不做赘述。
2 工厂方法模式
定义: 工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
主要的 UML 类图示例如下:
主要使用的工厂模式步骤如下:
1 创建抽象工厂类,定义具体工厂的公共接口
2 创建抽象产品类定义,具体产品的公共接口
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,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。(抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。)
2 创建抽象产品族类 ,定义抽象产品的公共接口
3 创建抽象产品类 (继承抽象产品族类),定义具体产品的公共接口
4 创建具体产品类(继承抽象产品类) & 定义生产的具体产品
5 创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法
6 客户端通过实例化具体的工厂类,并调用其创建不同目标产品的方法创建不同具体产品类的实例
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的设计模式大体上分为三大类:
- 创建型模式(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 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 程序员轻松地访问和操纵命名和目录服务中的数据,实现资源查找、服务发现和命名空间管理等功能。
以上就是Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合的详细内容,更多请关注php中文网其它相关文章!
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 框架的兼容性和协作是其成功的关键因素之一。它使开发人员能够轻松地将应用程序连接到各种命名和目录服务,并利用这些服务的特性和功能来构建强大的、可扩展的应用程序。
以上就是Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作的详细内容,更多请关注php中文网其它相关文章!
java – ZK:设计模式:寻找大量数据?
目前,我检索所有用户数据并将其粘贴在列表框中.这是非常好的,但是当我们有10万用户时,我不想填充有10万用户的列表框,也不希望在服务器上有10万用户的集合.
你会推荐一个很好的方法来做到这一点?
我应该保留ConnectedRecordset并将其传递给列表框. ZK是否有能力管理数据和连接?
〜或〜
手动查找页面事件是否更好,并使用第二组数据重新填充列表框,一次只拉10行?
此外,当我想允许用户按列排序时,肯定需要重新查询数据库中的数据.
挑战这个的正确方法是什么?请提供建议或文章链接.
谢谢,
标记
解决方法
我们今天的关于java 设计模式,工厂,代理模式等和java的工厂设计模式的分享就到这里,谢谢您的阅读,如果想了解更多关于java - 设计模式、Java JNDI 与其他 Java 技术的协作:揭秘 Java JNDI 与 Java EE 等技术的融合、Java JNDI 与其他 Java 框架的兼容性:解析 Java JNDI 与其他 Java 框架的兼容性和协作、java – ZK:设计模式:寻找大量数据?的相关信息,可以在本站进行搜索。
本文标签: