java 원형 디자인 모드

3989 단어 디자인 모드
정의:프로 토 타 입 모드 는 프로 토 타 입 인 스 턴 스 로 생 성 대상 의 종 류 를 지정 하고 이 프로 토 타 입 을 복사 하여 새로운 대상 을 만 드 는 것 입 니 다. 
그것 의 장면 은 같은 대상 을 여러 번 자주 만 드 는 데 있다.
원형 디자인 모델 은 깊 은 복사 와 얕 은 복사 지식 을 사용한다. 깊 은 복사 와 얕 은 복사 가 무엇 인지 모 르 면 자 료 를 찾 아 보 세 요.여기 서 는 말 하지 않 겠 습 니 다.저 는 면접 을 봐 야 합 니 다.시간 이 없습니다.
public class Order implements Cloneable{
    private String name;
    private int id;
    private double money;

    public Order(String name, int id, double money) {
        this.name = name;
        this.id = id;
        this.money = money;
    }

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }
    @Override
    protected Order clone() throws CloneNotSupportedException {
        return (Order) super.clone();
    }

    @Override
    public String toString() {
        return "Order{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", money=" + money +
                '}';
    }
}

위의 Order 에 서 는 인용 유형 변 수 를 사용 하지 않 았 기 때문에 얕 은 복사 본 을 사 용 했 습 니 다.있 으 면 깊 은 복사 본 을 사용 하 는 것 이 좋 습 니 다.왜 냐 면 얕 은 복사 와 깊 은 복사 가 무엇 인지 스스로 알 아 보 는 것 이 좋 습 니 다.그들의 차이 점 은 어디 에 있 습 니까?
테스트 클래스
public class Client {
    public static void main(String[] args) {
        Order order = new Order("iphone  ",1,5000);
        for(int i=0;i<100;i++){
            try {
                Order cloneOrder =  order.clone();
                System.out.println("cloneOrder="+cloneOrder);
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
        }
    }
}

갑자기 생각 났 는데,창설 대상 은 네 가지 방식 이 있 는데 그것 이 바로 뉴 클론 이다 서열 화 와 반 서열 화 반사
클론 파괴 단일 디자인 모드
public class Singleton implements Cloneable {
    private String name;
    private int id;
    private Singleton(){}
    private static class Holder{
        private static final Singleton holder = new Singleton();
    }
    public static Singleton getInstance(){
        return Holder.holder;
    }

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

테스트 클래스
public class Test {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        try {
            Method method = singleton.getClass().getDeclaredMethod("clone");
            method.setAccessible(true);
            Singleton cloneSingleton = (Singleton) method.invoke(singleton,null);
            System.out.println("    :"+singleton);
            System.out.println("      :"+cloneSingleton);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

log:
    :com.kd.principle.protoType.Singleton@511d50c0
      :com.kd.principle.protoType.Singleton@60e53b93

복 제 된 대상 과 원시 대상 이 하나의 대상 이 아니 라 는 것 을 발견 하면 단일 모델 의 정의 에 어 긋 나 복제 가 단일 모델 을 파괴 하 는 것 을 방지 할 수 있다.
첫째:Cloneable 인 터 페 이 스 를 실현 하지 마 세 요.
두 번 째:만약 에 Cloneable 인 터 페 이 스 를 실현 하려 면 clone 방법 은
 @Override
    protected Object clone() throws CloneNotSupportedException {
        return Holder.singleton;
    }

좋은 웹페이지 즐겨찾기