원형 모델 과 창조 자 모델

3629 단어 디자인 모드
원형 모델 은 복 제 를 이용 하여 대상 의 복 제 를 실현 하 는 것 이다. 이 는 이러한 상황 에 적용 된다. 기 존의 대상 과 비슷 하 게 생 긴 대상 이 필요 하 다.간단 하 죠?
class A{
	String name;
	int age;
	boolean sex;//man true;female false
	int grade;
	public A(){
		name = "zhangsan";
		age = 20;
		sex = true;
		grade = 3;
	}
	
//	getter and setter
	
	public A clone(){		
		return new A();
	}
}

clone 사용 ():
public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a = new A();
		A aa = a.clone();
		a.name = "lisi";
	}

A 대상 a 가 있 습 니 다. a 와 이름 만 다른 대상 이 필요 하 다 면 a 를 복제 하고 이름 을 바 꾸 면 됩 니 다.
이 가능 하 다, ~ 할 수 있다,...이런 상황 에서 이상 의 방법 을 사용 하면 안 된다.자바 에 서 는 직렬 화 체 제 를 제공 합 니 다. Serializable 인 터 페 이 스 를 실현 하 는 클래스 라면 모두 직렬 화 될 수 있 습 니 다. 그러면 우 리 는 더 좋 은 clone () 을 다시 쓸 수 있 습 니 다.예:
class Test implements Serializable{
	B b = new B();
	
	public Object 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);
		Test2 test = (Test2)ois.readObject();
		return test;
	}
}
class B implements Serializable{
	
}

이렇게 되면 deepClone () 을 호출 하면 새로운 대상 을 만 들 수 있다.주의해 야 할 것 은 직렬 화 하려 는 클래스 에 인용 형식 이 Serializable 인 터 페 이 스 를 실현 하지 못 하면 프로그램 에 이상 이 생 길 수 있다 는 것 이다.
이상 은 원형 모델 입 니 다. 다음은 건축 자 모델 을 말씀 드 리 겠 습 니 다.
건축 자 모델 도 흔 하지 않 고 자세히 말 하지 않 겠 다.코드 바로 올 려 주세요.
class Product{
	String part1;
	String part2;
	String part3;
	String part4;
}
class Derector{
	AbstractBuilder a;
	public Derector(){
		
	}
	public Derector(AbstractBuilder a){
		this.a = a;
	}
	public Product construct(){
		a.buildPart1();
		a.buildPart2();
		a.buildPart3();
		a.buildPart4();
		return a.getResult();
	}
}
abstract class AbstractBuilder{
	protected Product product = new Product();
	
	abstract void buildPart1();
	abstract void buildPart2();
	abstract void buildPart3();
	abstract void buildPart4();
	
	public Product getResult(){
		return product;
	}
}
class Builder1 extends AbstractBuilder{

	@Override
	public void buildPart1() {
		// TODO Auto-generated method stub
		product.part1 = "       part 1";
	}

	@Override
	public void buildPart2() {
		// TODO Auto-generated method stub
		product.part2 = "       part 2";
	}

	@Override
	public void buildPart3() {
		// TODO Auto-generated method stub
		product.part3 = "       part 3";
	}

	@Override
	public void buildPart4() {
		// TODO Auto-generated method stub
		product.part4 = "       part 4";
	}
	
}

class Builder2 extends AbstractBuilder{

	@Override
	public void buildPart1() {
		// TODO Auto-generated method stub
		product.part1 = "       part 1";
	}

	@Override
	public void buildPart2() {
		// TODO Auto-generated method stub
		product.part2 = "       part 2";
	}

	@Override
	public void buildPart3() {
		// TODO Auto-generated method stub
		product.part3 = "       part 3";
	}

	@Override
	public void buildPart4() {
		// TODO Auto-generated method stub
		product.part4 = "       part 4";
	}
	
}

코드 가 비교적 길 지만 매우 간단 하 다.그만 해.
지금까지 다섯 개의 디자인 모델 을 배 웠 는데 이 다섯 가 지 는 하나의 유형 으로 분류 되 었 다. 즉, 창설 형 디자인 모델 이다.이 다섯 가지 디자인 모델 을 배 웠 으 니 시스템 이 비교적 좋 은 확장 성 을 가 지 려 면 추상 적 인 프로 그래 밍 을 해 야 한다. 그래 야 '변 하지 않 고 변화 에 응 할 수 있다' 는 것 을 뚜렷하게 발견 할 수 있다. 추상 적 인 것 일수 록 적용 범위 가 넓 어 지 는 것 이 정말 맞다.
다음은 구조 적 디자인 모델 이다.

좋은 웹페이지 즐겨찾기