[java] 设计模式

资料链接
在这里插入图片描述
单例模式:某个类只能有一个实例,提供一个全局的访问点。

简单工厂:一个工厂类根据传入的参量决定创建出那一种产品类的实例。

工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。

抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。

建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。

原型模式:通过复制现有的实例来创建新的实例。

适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。

组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构。

装饰模式:动态的给对象添加新的功能。

代理模式:为其他对象提供一个代理以便控制这个对象的访问。

亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象。

外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。

桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。

模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。

策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。

状态模式:允许一个对象在其对象内部状态改变时改变它的行为。

观察者模式:对象间的一对多的依赖关系。

备忘录模式:在不破坏封装的前提下,保持对象的内部状态。

中介者模式:用一个中介对象来封装一系列的对象交互。

命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。

访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。

责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。

迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。

单例模式

  1. 懒汉式单例类.在第一次调用的时候实例化自己 (线程不安全)
public class Singleton {
    private Singleton() {}
    private static Singleton single=null;
    public static Singleton getInstance() {
         if (single == null) {  
             single = new Singleton();
         }  
        return single;
    }
}

可以给方法之间加上synchronized保证线程安全,但是会导致很大的性能开销,因为加锁其实只需要在第一次初始化的时候用到,之后的调用都没必要再进行加锁。

双重检测锁+volatile保证线程安全

public class Singleton {
    private volatile static Singleton single;
    private Singleton() {
    }
    public Singleton getInstance() {
        if (null == single) {
            synchronized (Singleton.class) {
                if (null == single) {
                    single = new Singleton(); //flag
                }
            }
        }
        return single;
    }
}

为什么要加volatile,为了禁止指令重排序

标记为flag的那行,实际上可以分解成以下三个步骤:

  1. 分配内存空间
  2. 初始化对象
  3. 将对象指向刚分配的内存空间

但是有些编译器为了性能的原因,可能会将第二步和第三步进行重排序,这样某些线程会得到一个初始化未完成的对象

  1. 饿汉式单例类.在类初始化时,已经自行实例化 (线程安全)
public class Singleton {
    private Singleton() {}
    private static final Singleton single = new Singleton1();
    //静态工厂方法 
    public static Singleton1 getInstance() {
        return single;
    }
}

简单工厂模式

interface Fruit{
    public void buy();
}
class Apple implements Fruit{
    public void buy(){
        System.out.println("buy apple");
    }
}
class Banana implements Fruit{
    public void buy(){
        System.out.println("buy banana");
    }
}
class Orange implements Fruit{
    public void buy(){
        System.out.println("buy orange");
    }
}


class Factory{
    public static Fruit produce(String kind){
        if(kind.equals("apple"))return new Apple();
        else if(kind.equals("banana"))return new Banana();
        else return new Orange();
    }
}

public class Main{

    public static void main(String[] args) {
        Fruit fruit= Factory.produce("apple");
        fruit.buy();
    }
}

工厂方法模式

interface Fruit{
    public void buy();
}
class Apple implements Fruit{
    public void buy(){
        System.out.println("buy apple");
    }
}
class Banana implements Fruit{
    public void buy(){
        System.out.println("buy banana");
    }
}
class Orange implements Fruit{
    public void buy(){
        System.out.println("buy orange");
    }
}

interface Factory{
    public Fruit produce();
}

class AppleFactory implements Factory{
    public Apple produce(){
        return new Apple();
    }
}
class BananaFactory implements Factory{
    public Banana produce(){
        return new Banana();
    }
}
class OrangeFactory implements Factory{
    public Orange produce(){
        return new Orange();
    }
}


public class Main{

    public static void main(String[] args) {
        Factory appleFactory=new AppleFactory();
        Fruit apple=appleFactory.produce();
        apple.buy();
        
    }
}

抽象工厂模式

interface BigFruit{
    public void buy();
}
interface SmallFruit{
    public void buy();
}
class BigApple implements BigFruit{
    public void buy(){
        System.out.println("buy Big apple");
    }
}
class BigBanana implements BigFruit{
    public void buy(){
        System.out.println("buy Big banana");
    }
}
class BigOrange implements BigFruit{
    public void buy(){
        System.out.println("buy Big orange");
    }
}
class SmallApple implements SmallFruit{
    public void buy(){
        System.out.println("buy Small apple");
    }
}
class SmallBanana implements SmallFruit{
    public void buy(){
        System.out.println("buy Small banana");
    }
}
class SmallOrange implements SmallFruit{
    public void buy(){
        System.out.println("buy Small orange");
    }
}

interface Factory{
    public BigFruit produceBig();
    public SmallFruit produceSmall();
}

class AppleFactory implements Factory{
    public BigApple produceBig(){
        return new BigApple();
    }
    public SmallApple produceSmall(){
        return new SmallApple();
    }
}
class BananaFactory implements Factory{
    public BigBanana produceBig(){
        return new BigBanana();
    }
    public SmallBanana produceSmall(){
        return new SmallBanana();
    }
}
class OrangeFactory implements Factory{
    public BigOrange produceBig(){
        return new BigOrange();
    }
    public SmallOrange produceSmall(){
        return new SmallOrange();
    }
}


public class Main{

    public static void main(String[] args) {
        Factory appleFactory=new AppleFactory();
        BigFruit bigapple=appleFactory.produceBig();
        bigapple.buy();

    }
}

建造者模式

public class BuliderTest {
    public static void main(String[] args) {
        ProductBuilder defaultConcreteProductBulider=new DefaultConcreteProductBulider();
        Director director=new Director(defaultConcreteProductBulider);
        Product product=director.makeProduct("product1","company1","p1","p2","p3","p4");
        System.out.println(product);
    }

}



interface ProductBuilder{
    void builderProductName(String productName);
    void buildercompanyName(String companyName);
    void builderPart1(String part1);
    void builderPart2(String part2);
    void builderPart3(String part3);
    void builderPart4(String part4);
    Product build();
}

class DefaultConcreteProductBulider implements ProductBuilder{
    private String productName;
    private String companyName;
    private String part1;
    private String part2;
    private String part3;
    private String part4;
    @Override
    public void builderProductName(String productName) {
        this.productName=productName;
    }

    @Override
    public void buildercompanyName(String companyName) {
        this.companyName=companyName;
    }

    @Override
    public void builderPart1(String part1) {
        this.part1=part1;
    }

    @Override
    public void builderPart2(String part2) {
        this.part2=part2;

    }

    @Override
    public void builderPart3(String part3) {
        this.part3=part3;

    }

    @Override
    public void builderPart4(String part4) {
        this.part4=part4;

    }

    @Override
    public Product build() {
        return new Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);
    }
}

class Director{
    private ProductBuilder builder;

    public Director(ProductBuilder builder) {
        this.builder = builder;
    }

    public Product makeProduct(String productName, String companyName, String part1, String part2, String part3, String part4){
        builder.builderProductName(productName);
        builder.buildercompanyName(companyName);
        builder.builderPart1(part1);
        builder.builderPart2(part2);
        builder.builderPart3(part3);
        builder.builderPart4(part4);
        return builder.build();
    }
}

class Product{
    private String productName;
    private String companyName;
    private String part1;
    private String part2;
    private String part3;
    private String part4;

    public Product(String productName, String companyName, String part1, String part2, String part3, String part4) {
        this.productName = productName;
        this.companyName = companyName;
        this.part1 = part1;
        this.part2 = part2;
        this.part3 = part3;
        this.part4 = part4;
    }

    public Product() {

    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getPart1() {
        return part1;
    }

    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public String getPart2() {
        return part2;
    }

    public void setPart2(String part2) {
        this.part2 = part2;
    }

    public String getPart3() {
        return part3;
    }

    public void setPart3(String part3) {
        this.part3 = part3;
    }

    public String getPart4() {
        return part4;
    }

    public void setPart4(String part4) {
        this.part4 = part4;
    }
}

装饰器模式

public class DecoratorTest {
    public static void main(String[] args) {
        Component component=new ConcreteDecorator1(new ConcreteComponent());
        component.operation();
    }
}
interface Component{
    void operation();
}
class ConcreteComponent implements Component{
    @Override
    public void operation() {
        System.out.println("拍照");
    }
}

abstract class Decorator implements Component{
    Component component;

    public Decorator(Component component) {
        this.component = component;
    }
}

class ConcreteDecorator1 extends Decorator{
    public ConcreteDecorator1(Component component){
        super(component);
    }

    @Override
    public void operation() {
        System.out.println("添加美颜");
        component.operation();
    }
}

适配器模式

public class AdapterTest {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target=new Adapter(adaptee);
        target.output5v();

    }
}
class Adaptee{
    public int output220v(){
        return 220;
    }
}

interface Target{
    int output5v();
}

class Adapter implements Target{
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public int output5v() {
        int i=adaptee.output220v();
        System.out.println(String.format("原始电压:%d v-->输出电压:%d v",i,5));
        return 5;
    }
}

观察者模式

import java.util.ArrayList;
import java.util.List;

public class ObserverTest {
    public static void main(String[] args) {
        Subject subject=new Subject();
        subject.addObserver(new Task1());
        Task2 task2=new Task2();
        subject.addObserver(task2);
        subject.notiyObserver("xxxx");
        subject.removeObserver(task2);
        subject.notiyObserver("xxxx");
    }
}

class Subject{
    private List<Observer> container=new ArrayList<>();

    public void addObserver(Observer observer){
        container.add(observer);
    }
    public void removeObserver(Observer observer){
        container.remove(observer);
    }
    public void notiyObserver(Object object){
        for(Observer observer:container){
            observer.update(object);
        }
    }
}
interface Observer{
    void update(Object object);
}
class Task1 implements Observer{
    @Override
    public void update(Object object) {
        System.out.println("task1 received:"+object);
    }
}

class Task2 implements Observer{
    @Override
    public void update(Object object) {
        System.out.println("task2 received:"+object);
    }
}

外观模式/门面模式

import javax.crypto.Cipher;

public class FacadeTest {
    public static void main(String[] args) {
        Client1 client1=new Client1();
        client1.doSomething();
        Client2 client2=new Client2();
        client2.doSomething();
    }
}

class Client1{
    Facade facade=new Facade();

    public void doSomething(){
        facade.doSomething();
    }
}
class Client2{
    Facade facade=new Facade();

    public void doSomething(){
        facade.doSomething();
    }
}

class Facade{
    SubSystem1 subSystem1=new SubSystem1();
    SubSystem2 subSystem2=new SubSystem2();
    SubSystem3 subSystem3=new SubSystem3();

    public void doSomething(){
        subSystem1.method();
        subSystem2.method();
        subSystem3.method();
    }
}

class SubSystem1{
    public void method(){
        System.out.println("subsystem1.method executed");
    }
}

class SubSystem2{
    public void method(){
        System.out.println("subsystem2.method executed");
    }
}

class SubSystem3{
    public void method(){
        System.out.println("subsystem3.method executed");
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式是一套对代码设计经验的总结,被人们反复利用,并且很多人都熟知的代码设计方式。其中,单例模式是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这种模式有几个好处,比如可以节约系统资源,提高程序效率,以及提供一个全局访问点等。在实现单例模式时,可以采用饿汉式单例模式,即在类加载时创建一个对象,并通过私有构造器和静态方法来保证对象的唯一性。另外,工厂方法模式也是Java中常用的设计模式之一。在工厂方法模式中,可以定义一个工厂类,该类负责创建对象的实例,并将其封装在一个工厂方法中。通过这种方式,可以实现对象的创建与使用的分离,提高代码的灵活性和可维护性。总的来说,Java设计模式是一种用于解决特定问题的通用解决方案,可以提高代码的重用性、可读性和可扩展性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java常用设计模式](https://blog.csdn.net/qq_33327680/article/details/123815614)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [JAVA中23种设计模式](https://blog.csdn.net/qw_0214/article/details/78878531)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值