"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 원기

원기

2024-11-08에 게시됨
검색:511

Prototype

창의적인 디자인 패턴 중 하나입니다.
주어진 객체의 중복/얕은 복사본을 만드는 데 사용됩니다.
이 패턴은 객체를 직접 생성하는 것이 비용이 많이 드는 경우에 유용합니다. 예: 대규모 데이터베이스를 쿼리한 후 객체를 생성한 경우 객체를 계속해서 생성하는 것은 성능 측면에서 경제적이지 않습니다.
따라서 객체가 생성되면 객체를 캐시하고 나중에 동일한 객체가 필요할 때 데이터베이스에서 다시 생성하는 대신 캐시에서 객체를 가져오고 데이터베이스 호출을 줄이기 위해 필요할 때 데이터베이스를 업데이트합니다. .

참고: Cloneable을 사용해야 합니다. 즉, 복제해야 하는 개체에 대한 마커 인터페이스입니다. it(Clonable)에는 메서드가 포함되어 있지 않으며 클래스를 복제할 수 있다는 신호를 보냅니다. 이는 클래스의 복사본을 만드는 것을 의미합니다. 물체.

Object.clone() 메서드는 기본적으로 얕은 복사본을 생성합니다.
기본적으로 clone() 메서드는 객체의 단순 복사본을 수행합니다. 즉, 새 개체를 만들고 원래 개체의 모든 필드를 새 개체에 복사합니다. 그러나 개체에 다른 개체(예: 배열, 목록 또는 사용자 정의 개체)에 대한 참조가 포함되어 있는 경우 참조가 가리키는 실제 개체가 아닌 참조 자체가 복사됩니다.
결과적으로 원본 개체와 복제된 개체는 모두 해당 필드에 대해 동일한 개체를 참조합니다. 한 인스턴스를 통해 참조된 개체에 대한 모든 변경 사항은 다른 인스턴스에 반영됩니다.

복제할 수 있는 Shape 개체의 예를 통해 이를 이해해 보겠습니다.

모양

public class Shape implements Cloneable {
    private String id;
    protected String shape;

    @Override
    public String toString() {
        return "Shape [id="   id   ", shape="   shape   "]";
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getShape() {
        return shape;
    }

    @Override
    public Object clone(){
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

하위 수업

public class Rectangle extends Shape {

    public Rectangle(){
        shape = "Rectangle";
    }
    public void draw(){
       System.out.println("calling draw() of Rectangle shape");
    }
}

public class Circle extends Shape {
    public Circle(){
        shape = "Circle";
    }
    public void draw(){
        System.out.println("Calling draw in Circle method");
    }
}

은닉처

public class ShapeCache {
    public static HashMap cache = new HashMap();

    public static Shape cloneObject(String id){
        return (Shape)cache.get(id);
    }
    public static void addShapeInCache(Shape shape){
        cache.put(shape.getId(),shape);
    }

}

기본

public class Main {
    public static void main(String args[]){
        Shape circle = new Circle();
        circle.setId("1");
        Shape rectangle = new Rectangle();
        rectangle.setId("2");

        ShapeCache.addShapeInCache(rectangle);
        ShapeCache.addShapeInCache(circle);

        Shape copyShape1 = (Shape) ShapeCache.cache.get(circle.getId());
        Shape copyShape2 =(Shape) ShapeCache.cache.get(rectangle.getId());

        System.out.println(copyShape1);
        System.out.println(copyShape2);
    }

}

산출:

Shape [id=1, shape=Circle]
Shape [id=2, shape=Rectangle]

핵심사항

  • 원과 직사각형 모두 코드의 정확성에 영향을 주지 않고 객체를 해당 하위 유형으로 대체할 수 있어야 한다는 Liskov 대체 원칙(SOLID 원칙)을 따릅니다.
  • Shape 객체의 얕은 복사본만 생성됩니다.
릴리스 선언문 이 글은 https://dev.to/prashantrmishra/prototype-15hn?1 에서 복제되었습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3