java 设计模式 常用21种

1.创造型:抽象工厂

package com.seezoon.创建型.抽象工厂;

/**
 * 抽象工厂
 * @author DF
 *工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,
 *必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?
 *就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,
 *不需要修改之前的代码
 */
public class AbstractFactory {
	public static void main(String[] args) {
		IFactory factory = new ProductAFactory();
		IProduct product = factory.produce();
		product.productMethod();
	}
}
interface IFactory {
	public IProduct produce();
}
class ProductAFactory implements IFactory{
	@Override
	public IProduct produce() {
		return new ProductA();
	}
}
class ProductBFactory implements IFactory{
	@Override
	public IProduct produce() {
		return new ProductB();
	}
}
interface IProduct {
	public void productMethod();
}

class ProductA implements IProduct {
	@Override
	public void productMethod() {
		System.out.println("ProductA");
	}
}

class ProductB implements IProduct {

	@Override
	public void productMethod() {
		System.out.println("ProdectB");
	}
}

2.创造型:单例

package com.seezoon.创建型.单例;

import jdk.internal.dynalink.beans.StaticClass;

/**
 * 简单单例模式(严格的单例模式一般情况不适用可自行科普。) 
 * @author DF
 *  单例模式(Singleton)
          单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,
          该对象只有一个实例存在。这样的模式有几个好处:
    1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
    2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
    3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。
       (比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
       
   Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。
核心知识点如下:
(1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。
(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。
(3) 定义一个静态方法返回该类的实例。    
 */

/**
 * 1.单例模式的实现:饱汉式,非线程安全
 * 优点是:写起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,
 * 当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存;
缺点是:并发环境下很可能出现多个SingletonTest实例。
 * @author HP
 *
 */
public class Singleton {

	/* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */  
    private static Singleton instance = null;  
    /* 私有构造方法,防止被实例化 */  
    private Singleton() {  
    }  
    /* 静态工程方法,创建实例 */  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

/**
 * 2.单例模式的实现:饿汉式,线程安全 但效率比较低 
 * 优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题;
缺点是:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,
从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),
当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。
 */

/**public*/ class SingletonTest {  

    // 定义一个私有的构造方法
    private SingletonTest() {  
    }  

    // 将自身的实例对象设置为一个属性,并加上Static和final修饰符
    private static final SingletonTest instance = new SingletonTest();  

    // 静态方法返回该类的实例
    public static SingletonTest getInstancei() {  
        return instance;  
    }  
  
}
3.创建型.:工厂方法.多个工厂方法

package com.seezoon.创建型.工厂方法.多个工厂方法;


/**
 * 多个工厂方法模式
 * 是对普通工厂方法模式的改进,在普通工厂方法模式中,
 * 如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象
 * @author DF
 *
 */
public class MutiFactoryMethod {
	public static void main(String[] args) {
		MutiFactory factory = new MutiFactory();
		IProduct product = factory.produceA();
		product.productMethod();
	}
}
class MutiFactory{
	public IProduct produceA(){
		return new ProductA();
	}
	public IProduct produceB(){
		return new ProductB();
	}
}

interface IProduct {
	public void productMethod();
}

class ProductA implements IProduct {
	@Override
	public void productMethod() {
		System.out.println("ProductA");
	}
}

class ProductB implements IProduct {
	@Override
	public void productMethod() {
		System.out.println("ProductB");
	}
}
4.创造型:静态工厂

package com.seezoon.创建型.工厂方法.静态工厂;


/**
 * 静态工厂方法模式
 * 将多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可
 * @author DF
 *
 */
public class StaticiFactoryMethod {
	public static void main(String[] args) {
		IProduct product = StaticFactory.produceA();
		product.productMethod();
	}
}
class StaticFactory{
	public static IProduct produceA(){
		return new ProductA();
	}
	public static IProduct produceB(){
		return new ProductB();
	}
}
interface IProduct {
	public void productMethod();
}

class ProductA implements IProduct {
	@Override
	public void productMethod() {
		System.out.println("ProductA");
	}
}

class ProductB implements IProduct {
	@Override
	public void productMethod() {
		System.out.println("ProductB");
	}
}
5.创造型:普通工厂方法

package com.seezoon.创建型.工厂方法.普通工厂模式;

/**
 * 普通工厂方法比较常用
 * @author DF
 *
 */
public class NormalFactoryMethod {

	
	public static void main(String[] args) {
		Factory factory= new Factory();
		IProduct product = factory.produce("A");
		product.productMethod();
	}
}
class Factory{
	/**
	 * 一般可以做成配置 比如xml 
	 * @param product
	 * @return
	 */
	public IProduct produce(String product){
		if ("A".equals(product)) {
			return new ProductA();
		} else if ("B".equals(product)) {
			return new ProductB();
		} else {
			return null;
		}
	}
}
interface IProduct {
	public void productMethod();
}

class ProductA implements IProduct {
	@Override
	public void productMethod() {
		System.out.println("ProductA");
	}
}

class ProductB implements IProduct {
	@Override
	public void productMethod() {
		System.out.println("ProductB");
	}
}

6.创造型:建造者

package com.seezoon.创建型.建造者;


/**
 * 建造者模式
 * @author DF
 * 工厂模式关注的是创建单个产品,而建造者模式则关注创建符合对象
 */
public class Builder {
	 public static void main(String []args){
	        Director dir = new Director();
	        dir.getProduct1().showProduct();
	        dir.getProduct2().showProduct();
	    }
}
class Director {
    private AbsBuild build = new Build();
    public Product getProduct1(){
        build.setProd("df",15);
        return build.getProduct();
    }
    public Product getProduct2(){
        build.setProd("df",20);
        return build.getProduct();
    }
}


abstract class AbsBuild {
    public abstract void setProd(String name,int num);
    public abstract Product getProduct();
}
class Build extends AbsBuild {
    Product product = new Product();
    @Override
    public void setProd(String name, int num) {
        //To change body of implemented methods use File | Settings | File Templates.
        product.setName(name);
        product.setNum(num);
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

class Product {
    private String name;
    private int num;

    public void showProduct(){
        System.out.println("name :"+name);
        System.out.println("age:"+num);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

7.创造型:原型

package com.seezoon.创建型.原型;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 
 * @author DF
 *原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,
 *该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。
 *在Java中,复制对象是通过clone()实现的
 */
public class Prototype implements Cloneable,Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public void print(){
		System.out.println("hello Prototype !!!!!");
	}
	/**
	 * 该做法为浅复制
	 * 浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
	 */
	public Prototype clone() throws CloneNotSupportedException {  
        Prototype proto = (Prototype) super.clone();  
        return proto;  
    }  
	/**
	 * 深复制
	 * 深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。
	 * 简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底
	 * @return
	 * @throws IOException
	 * @throws ClassNotFoundException
	 */
    public Prototype deepClone() throws IOException, ClassNotFoundException {  
  
        /* 写入当前对象的二进制流 */  
        ByteArrayOutputStream bos = new ByteArrayOutputStream();  
        ObjectOutputStream oos = new ObjectOutputStream(bos);  
        oos.writeObject(this);  
        /* 读出二进制流产生的新对象 */  
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());  
        ObjectInputStream ois = new ObjectInputStream(bis);  
        Prototype prototype = (Prototype) ois.readObject();  
        ois.close();
        bis.close();
        oos.close();
        bos.close();
        return prototype;
    }  
    public static void main(String[] args) throws Exception {
    	Prototype prototype = new Prototype();
    	Prototype prototypeClone = prototype.clone();
    	Prototype prototypeDeepClone = prototype.deepClone();
    	prototypeClone.print();
    	prototypeDeepClone.print();
	}
}

8.结构型:代理

package com.seezoon.结构型.代理;

/**
 * 
 * @author DF
 *其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,
 *替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?
 *因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打官司,
 *我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法
 *
 *
 *代理模式的应用场景:
	如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
	1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
	2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
	使用代理模式,可以将功能划分的更加清晰,有助于后期维护!
 */
public class ProxySample {
	 public static void main(String[] args) {  
	        Sourceable source = new Proxy();  
	        source.method();  
	    }  
}
interface Sourceable {  
    public void method();  
} 
class Source implements Sourceable {  
	  
    @Override  
    public void method() {  
        System.out.println("the original method!");  
    }  
}  
class Proxy implements Sourceable {  
	  
    private Source source;  
    public Proxy(){  
        super();  
        this.source = new Source();  
    }  
    @Override  
    public void method() {  
        before();  
        source.method();  
        atfer();  
    }  
    private void atfer() {  
        System.out.println("after proxy!");  
    }  
    private void before() {  
        System.out.println("before proxy!");  
    }  
}  
9.结构型:桥接

package com.seezoon.结构型.桥接;

/**
 * 
 * @author DF
 *桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。
 *桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,
 *JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,
 *甚至丝毫不用动,原因就是JDBC提供统一接口,
 *每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了
 *
 *
 *
 *通过对Bridge类的调用,实现了对接口Sourceable的实现类SourceSub1和SourceSub2的调用
 */
public class BridgeSample {
	public static void main(String[] args) {  
        
        Bridge bridge = new MyBridge();  
          
        /*调用第一个对象*/  
        Sourceable source1 = new SourceSub1();  
        bridge.setSource(source1);  
        bridge.method();  
          
        /*调用第二个对象*/  
        Sourceable source2 = new SourceSub2();  
        bridge.setSource(source2);  
        bridge.method();  
    }  
}
interface Sourceable {  
    public void method();  
}  
class SourceSub1 implements Sourceable {  
	  
    @Override  
    public void method() {  
        System.out.println("this is the first sub!");  
    }  
}  
class SourceSub2 implements Sourceable {  
	  
    @Override  
    public void method() {  
        System.out.println("this is the second sub!");  
    }  
}  
abstract class Bridge {  
    private Sourceable source;  
  
    public void method(){  
        source.method();  
    }  
      
    public Sourceable getSource() {  
        return source;  
    }  
  
    public void setSource(Sourceable source) {  
        this.source = source;  
    }  
}  
class MyBridge extends Bridge {  
    public void method(){  
        getSource().method();  
    }  
}  

10.结构型:对象适配器

package com.seezoon.结构型.适配器.对象适配器;

/**
 * 对象适配器
 * @author DF
 *对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Adapter类,持有原类的一个实例,
 *在Adapter类的方法中,调用实例的方法就行。
 */
public class ObjectAdapter {
	public static void main(String[] args) {
		Source source = new Source();
		Adapter adapter = new Adapter(source);
		adapter.method1();
		adapter.method2();
	}
}

class Source {
	public void method1() {
		System.out.println("this is original method!");
	}
}

interface Targetable {
	/* 与原类中的方法相同 */
	public void method1();

	/* 新类的方法 */
	public void method2();
}

class Adapter implements Targetable {

	private Source source;

	public Adapter(Source source) {
		super();
		this.source = source;
	}

	@Override
	public void method2() {
		System.out.println("this is the targetable method!");
	}

	@Override
	public void method1() {
		source.method1();
	}
}



    

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Java常用的7设计模式包括:简单工厂模式、类适配器模式、对象适配器模式以及还有其他4设计模式。 简单工厂模式是一创建型设计模式,它使用一个工厂类来封装对象的创建过程。在简单工厂模式中,有一个抽象产品角色,多个具体产品角色和一个工厂类角色。工厂类根据客户端的要求,返回相应的具体产品角色的实例。 类适配器模式是一结构型设计模式,它通过继承来实现适配器。在类适配器模式中,适配器类继承自原始类,并实现目标接口。通过这方式,适配器类可以使用原始类的方法来实现目标接口的方法。 对象适配器模式也是一结构型设计模式,它通过组合来实现适配器。在对象适配器模式中,适配器类包含一个原始类的对象,并实现目标接口。通过调用原始类对象的方法来实现目标接口的方法。 除了简单工厂模式、类适配器模式和对象适配器模式,还有其他4常用设计模式,它们分别是:单例模式、观察者模式、装饰器模式和策略模式。这些设计模式都有各自的应用场景和用途,可以根据具体的需求选择合适的设计模式来解决问题。 简单工厂模式的代码示例参考于袁建华编著《Java设计模式与应用实践》第6章。 类适配器模式的代码示例参考于《Java设计模式》的博客文章。 对象适配器模式的代码示例参考于《Java设计模式》的博客文章。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java的七大常用设计模式](https://blog.csdn.net/gaobai_Siri/article/details/104937204)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java常用设计模式](https://blog.csdn.net/qq_45196093/article/details/130392953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值