{{위키데이터 속성 추적}}
[[파일:proxy_pattern_diagram.svg|섬네일|400px|[[UML]]의 프록시]]

[[파일:Proxy pattern in LePUS3.gif|섬네일|400px|[[Lepus3|LePUS3]]의 프록시 ([https://web.archive.org/web/20180314162121/http://www.lepus.org.uk/ref/legend/legend.xml legend]) ]]
'''프록시 패턴'''(proxy pattern)은 [[컴퓨터 프로그래밍]]에서 [[디자인 패턴|소프트웨어 디자인 패턴]]의 하나이다.

일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다. 프록시는 어떠한 것(이를테면 네트워크 연결, 메모리 안의 커다란 객체, 파일, 또 복제할 수 없거나 수요가 많은 리소스)과도 인터페이스의 역할을 수행할 수 있다.

프록시 패턴의 잘 알려진 예로는 [[참조 횟수 계산 방식|참조 횟수]] [[:en:Smart pointer|스마트 포인터]] 객체이다.

복합적인 오브젝트들의 다수의 복사본이 존재해야만 하는 상황에서 프록시 패턴은 애플리케이션의 메모리 사용량을 줄이기 위해서 [[플라이웨이트 패턴]]과 결합된 형태로 나올 수도 있다.


== 예 ==
=== 자바 ===
<syntaxhighlight lang="java">
import java.util.*;

interface Image {
    public void displayImage();
}

//on System A
class RealImage implements Image {
    private String filename;
    public RealImage(String filename) {
        this.filename = filename;
        loadImageFromDisk();
    }

    private void loadImageFromDisk() {
        System.out.println("Loading   " + filename);
    }

    @Override
    public void displayImage() {
        System.out.println("Displaying " + filename);
    }
}

//on System B
class ProxyImage implements Image {
    private String filename;
    private Image image;

    public ProxyImage(String filename) {
        this.filename = filename;
    }

    @Override
    public void displayImage() {
        if (image == null)
           image = new RealImage(filename);

        image.displayImage();
    }
}

class ProxyExample {
    public static void main(String[] args) {
        Image image1 = new ProxyImage("HiRes_10MB_Photo1");
        Image image2 = new ProxyImage("HiRes_10MB_Photo2");

        image1.displayImage(); // loading necessary
        image2.displayImage(); // loading necessary
    }
}
</syntaxhighlight>

출력:
 Loading    HiRes_10MB_Photo1
 Displaying HiRes_10MB_Photo1
 Loading    HiRes_10MB_Photo2
 Displaying HiRes_10MB_Photo2
=== C# ===
<syntaxhighlight lang="csharp">
using System;

namespace Proxy
{
    class Program
    {
        interface IImage
        {
            void Display();
        }

        class RealImage : IImage
        {
            public RealImage(string fileName)
            {
                FileName = fileName;
                LoadFromFile();
            }

            private void LoadFromFile()
            {
                Console.WriteLine("Loading " + FileName);
            }

            public String FileName { get; private set; }

            public void Display()
            {
                Console.WriteLine("Displaying " + FileName);
            }
        }

        class ProxyImage : IImage
        {
            public ProxyImage(string fileName)
            {
                FileName = fileName;
            }

            public String FileName { get; private set; }

            private IImage image;

            public void Display()
            {
                if (image == null)
                    image = new RealImage(FileName);
                image.Display();
            }
        }

        static void Main(string[] args)
        {
            IImage image = new ProxyImage("HiRes_Image");
            for (int i = 0; i < 10; i++)
                image.Display();
        }
    }
}

</syntaxhighlight>

출력 :
 Loading HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image
 Displaying HiRes_Image

== 같이 보기 ==
* [[컴포지트 패턴]]
* [[데코레이터 패턴]]

{{디자인 패턴(소프트웨어)}}

[[분류:소프트웨어 디자인 패턴]]