Дизайн паттерндер. 6-сабақ. Құру паттерндері (Creational patterns)

Блог аты abzalkalimbetov
Аты: Prototype
Проблема: Объектіні құру ұзаққа созылады (мысалға: дерекқор операциясынан кейін)
Шешім: Объектінің кешін жасап, келесі қолданылымда объектінің дупликатын клондау
1. Clonable интерфейсінің реализациясын жасайтын абстракт класс жасау

public abstract class Shape implements Cloneable {
   
   private String id;
   protected String type;
   
   abstract void draw();
   
   public String getType(){
      return type;
   }
   
   public String getId() {
      return id;
   }
   
   public void setId(String id) {
      this.id = id;
   }
   
   public Object clone() {
      Object clone = null;
      
      try {
         clone = super.clone();
         
      } catch (CloneNotSupportedException e) {
         e.printStackTrace();
      }
      
      return clone;
   }
}


2. Нақты класстар жасау

public class Rectangle extends Shape {

   public Rectangle(){
     type = "Rectangle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

public class Square extends Shape {

   public Square(){
     type = "Square";
   }

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

public class Circle extends Shape {

   public Circle(){
     type = "Circle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

3. Кеш қызметін атқаратын класс құру

public class ShapeCache {
	
   private static Hashtable<String, Shape> shapeMap  = new Hashtable<String, Shape>();

   public static Shape getShape(String shapeId) {
      Shape cachedShape = shapeMap.get(shapeId);
      return (Shape) cachedShape.clone();
   }

    public static void loadCache() {
      Circle circle = new Circle();
      circle.setId("1");
      shapeMap.put(circle.getId(),circle);

      Square square = new Square();
      square.setId("2");
      shapeMap.put(square.getId(),square);

      Rectangle rectangle = new Rectangle();
      rectangle.setId("3");
      shapeMap.put(rectangle.getId(), rectangle);
   }
}

4. Кешті қолданатын клиент класс құру

public class PrototypePatternDemo {
   public static void main(String[] args) {
      ShapeCache.loadCache();

      Shape clonedShape = (Shape) ShapeCache.getShape("1");
      System.out.println("Shape : " + clonedShape.getType());		

      Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
      System.out.println("Shape : " + clonedShape2.getType());		

      Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
      System.out.println("Shape : " + clonedShape3.getType());		
   }
}


Нәтиже: Объектілерді құру кеш арқылы жылдамдатылды

4 пікір

avatar
Осы паттернды нақты практикада қай кездерде қолданылады, мысалы?
avatar
Бірнеше бір типті объектілер болса және олардың деректері көбіне бірдей болса
avatar
GUI бар делік екі бөліктен. Мысалға сізде жылдық есеп (отчет) датасы бойынша өсу ретінде бар, базадан алған. Енді сізге GUI 2-жағында кемі ретінде керек болды. Қайтадан базадан аласыз ба? Алде Клон жасайсыз ба?
avatar
Әлбетте, клон жасаған дұрысырақ болады.
Тек қана тіркелген және авторизациядан өткен қолданушылар пікір қалдыра алады.