Object Oriented Analysis and Design Design Patterns Introduction to Design Patterns Week #9 Jarungjit Parnjai
Lecture Outline What is A Pattern? Why Patterns? Software Patterns GoF Design Patterns Singleton (Object Creational Design Patterns)
What is A Pattern? A Pattern ถูกใช้ในงานของสถาปนิก ชื่อ Christopher Alexander Alexander ศึกษาแนวทางการปรับปรุงกระบวนการออกแบบอาคาร และสิ่งก่อสร้าง “Each pattern is a three-part rule, which expresses a relation between a certain context, a problem and a solution.” definition : “A solution to a problem in a context”
A Solution to a Problem in a Context สถานการณ์ที่เกิดปัญหาการออกแบบขึ้น Problem ปัญหาที่เกิดขึ้นซ้ำๆ กันใน Context Solution แนวทางการแก้ปัญหาที่พิสูจน์แล้วว่าใช้งานได้จริง ระบุส่วนผสมขององค์ประกอบเพื่อสร้างความสมดุลของแนวทางการแก้ปัญหา
Why Patterns? Erich Gamma “Designing object-oriented software is hard and designing reusuable object-oriented software is even harder.” นักออกแบบที่เชี่ยวชาญนำใช้ Solution ที่สามารถทำงานได้ผลในอดีตกลับมาใช้ไหม่ โครงสร้างของระบบเชิงวัตถุที่ดีจะมี Pattern ของ Class และ Object เกิดขึ้นซ้ำแบบเดิม ความรู้เกี่ยวกับ Pattern ที่สามารถทำงานได้ผลในอดีต ทำให้นักออกแบบระบบสามารถทำงานได้อย่างมีประสิทธิผล และทำให้เกิดความยืดหยุ่นในการออกแบบ และนำมาใช้ใหม่
Software Patterns History 1987 - CunningHam และ Beck ใช้แนวคิดของ Alexander ในการพัฒนา Pattern Language สำหรับ Smalltalk 1990 - Gang of Four (Gamma, Helm, Johnson และ Vlissides ; GoF) เริ่มต้นรวบรวม catalog ของ design pattern 1991 - Bruce Anderson จัด Patterns Workshop ครั้งแรกขึ้นที่ OOPSLA 1993 - Kent Back และ Grady Booch ให้การสนับสนุน meeting ครั้งแรกของ Hillside Group 1994 - จัดประชุม Pattern Languages of Programs (PLoP) ครั้งแรก 1995 - GoF ตีพิมพ์หนังสือ “Design Pattern”
Types of Software Patterns Analysis Design Organizational Process Project Planning Configuration Management
Types of Software Patterns Software Pattern 3 ประเภท (Riehel และ Zullighoven) Conceptual Pattern Pattern whose form is described by means of terms and concepts from the application domain. Design Pattern Pattern whose form is described by means of software design constructs such as objects. Classes, inheritance and aggregation. Programming Pattern Pattern whose form is described by means of programming langugage
Design Patterns Levels of Abstraction Complex design for an entire application or subsystem Solution to a general design problem in a particular context Simple reusable design class such as a linked list, hash table, etc. More Abstract More Concrete
GoF Classification of Design Patterns GoF Design Patterns อยู่ในตรงกลางของ Levels of Abstraction “ A design pattern names, abstracts, and identifies key aspects of a common design structure that makes it useful for creating a reusable object-oriented design.” GoF Design Pattern “description of communicating objects and classes that are customized to solve a general design problem in a particular context.”
GoF Design Patterns Purposes - what a pattern does Creational Patterns เกี่ยวกับกระบวนการสร้าง Object Structural Patterns เกี่ยวกับโครงสร้าง และองค์ประกอบของ Class และ Object Behavioral Patterns เกี่ยวกับปฏิสัมพันธ์ระหว่าง Class และ Object Scope - what the pattern applies to Class Patterns เน้นความสัมพันธ์ระหว่าง Class และ Subclass ซึ่งเกี่ยวข้องกับการนำ Inheritance กลับมาใช้ใหม่ Object Patterns เน้นความสัมพันธ์ระหว่าง Object ซึ่งเน้นการนำ Composition กลับมาใช้ใหม่
GoF Design Patterns Class Object Scope Purpose Creational Structural Behavioral Factory Method Abstract Factory Builder Prototype Singleton Adapter Abstract Bridge Composite Façade Flyweight Proxy Interpreter Template Method Chain of Responsibility Command Iterator Mediator Memento State Strategy
Design for Change Creating an object by specifying a class explicitly Abstract Factory, Factory Method, Prototype Dependence on specific operation Chain of Responsibility, Command Dependence on h/w and s/w platforms Abstract Factory, Bridge Dependence on object representations or implementations Abstract Factory, Bridge, Memento, Proxy Algorithm Dependencies Builder, Iterator, Strategy, Template Method, Visitor
Design for Change (Continued) Tight Coupling Abstract factory, Bridge, Chain of Responsibility, Command, Façade, Mediator, Observer Extending functionality of subclassing Bridge, Chain of Responsibility, Composite, Decorator, Observer, Strategy Inability to alter classes conveniently Adapter, Decorator, Visitor
GoF Essential Elements of Design Patterns Pattern Name ชื่อสั้น และมีความหมาย เอื้อประโยชน์ในการสื่อสารภายในทีมผู้พัฒนา Problem problem และ context ที่ใช้ใน Pattern นี้ เงื่อนไขที่ต้องมีก่อนที่จะใช้ Pattern นี้ Solution คำอธิบายของ Element ที่ประกอบเป็น Design Pattern เน้นที่ relationship responsibilities และ collaboration ไม่ใช่ concrete design หรือการ implemenation แต่เป็น abstract description Consequences Pros และ Cons ของการใช้ pattern ซึ่งรวมถึงผลกระทบต่างๆ
GoF Pattern Template Pattern Name และ Classification ชื่อสั้น และมีความหมาย สำหรับ Pattern และ ประเภทของ Pattern Intent ประโยคสั้นๆ ที่อธิบายหน้าที่การทำงานของ pattern Also Known As ชื่ออื่นที่เป็นที่รู้จักของ Pattern นี้ Motivation สถานการณ์ที่ใช้ในการจำลองเหตุการณ์ที่นำ Pattern ไปใช้ประโยชน์ Applicability แนวทาง และ เทคนิคสำหรับการ implement
GoF Pattern Template (Continued) Structure การนำเสนอ pattern โดยใช้รูปภาพ Participants Class และ Object ที่มีส่วนร่วมใน pattern นี้ Collaborations การปฏิสัมพันธ์ระหว่าง participant เพื่อทำหน้าที่ที่ตัวเองมี responsibilities Consequences Pros และ Cons ของการเลือกใช้ Pattern นี้ Implementation แนวทาง และ เทคนิคสำหรับการ implement
GoF Pattern Template (Continued) Sample Code ส่วนของ Code ที่เป็นตัวอย่างสำหรับการ implement Known Uses ตัวอย่างของ Pattern ในระบบที่มีการใช้งานจริง Relatted Patterns Patterns อื่นที่ใกล้เคียงกับ Pattern นี้
Singleton Design Pattern
Singleton Case Study พิจารณาบริษัทแห่งหนึ่งต้องการพัฒนาระบบ ที่ต้องการเก็บข้อมูลต่างๆ เกี่ยวกับบริษัทได้แก่ ชื่อ, ที่อยู่ของสำนักงานใหญ่, ข้อมูลการจดทะเบียนของบริษัท และสามารถนำข้อมูลเหล่านั้นมาแสดงผ่านทาง application interface และพิมพ์รายงาน ข้อมูลต่างๆ ควรเก็บอยู่ในที่ใดที่หนึ่งภายใน application แต่สามารถถูกนำไปใช้โดยวัตถุที่แตกต่างกัน หลายๆ วัตถุ
Singleton First Design approach : อาจออกแบบให้สร้าง global data ภายใน ที่สามารถเข้าถึงได้จากวัตถุใดๆภายนอก ละเมิดกฏของ Encapsulation การเปลี่ยนแปลงใดๆที่เกิดขึ้นกับโครงสร้างข้อมูลที่เป็น global data มีผลกระทบถึงวัตถุที่เรียกใช้ข้อมูลเหล่านั้น
Singleton Second Design approach : วัตถุใดๆ ที่ต้องการเรียกใช้ วัตถุ “Company” ต้องรู้ Object Identifier (อาจอยู่ในรูปของตัวแปรอ้างอิง) ไปยังวัตถุ Object Identfier ต้องประกาศให้เป็น global ละเมิดกฏของ Encapsulation!!! Company - CompanyName - CompanyAddress - CompanyRegistrationNumber + getCompanyDetails()
Singleton Second Design approach : public class Company { private String name; private String address; private String regNumber; public Company(String n, String a, String r) { name = n; address = a; regNumber = r; } public String getCompanyName() { return name; } public String getCompanyAddress() { return address; } public String getCompanyRegistrationNumber() { return regNumber;
Singleton Third Design approach : คลาส “Company” มีเพียง instance เดียวเท่านั้น ใช้ Class Operation (Static Operation ในจาวา) ในการเข้าถึง Object Identifier Company - CompanyInstance : Company - CompanyName : String - CompanyAddress : String - CompanyRegistrationNumber : int + getCompanyInstance( ) : Comapany + getCompanyDetails() : String
Singleton Third Design approach : public class Company { private static Company instance = new Company("Company., Ltd.", "Burapha Unviersity", "99999"); private String name; private String address; private String regNumber; private Company(String n, String a, String r) { name = n; address = a; regNumber = r; } public static Company getCompanyInstance() { return instance; } public String getCompanyName() { return name; } public String getCompanyAddress() { return address; } public String getCompanyRegistrationNumber() { return regNumber;
Singleton Third Design approach : public class TestCompany { public static void main(String[] args) { Company instance1 = Company.getCompanyInstance(); if (instance1 == null) { System.out.println("null!!!"); } else { System.out.println("not null!!!"); System.out.println(instance1); System.out.println(instance1.getCompanyName()); System.out.println(instance1.getCompanyAddress()); System.out.println(instance1.getCompanyRegistrationNumber()+"\n");
Company instance2 = Company.getCompanyInstance(); if (instance2 == null) { System.out.println("null!!!"); } else { System.out.println("not null!!!"); System.out.println(instance2); System.out.println(instance2.getCompanyName()); System.out.println(instance2.getCompanyAddress()); System.out.println(instance2.getCompanyRegistrationNumber()); }
not null!!! Company@256a7c Company., Ltd. Burapha Unviersity 99999
Singleton Design Pattern Pattern Name Singleton / Object creational Problem class หนึ่ง class ใดมีเพียง instance เดียวเท่านั้น และกำหนด global point ที่ใช้ในการเข้าถึง instance ของ class นั้น Context สร้าง global data ภายใน ที่สามารถเข้าถึงได้จากวัตถุใดๆภายนอก หรือประกาศ Object Identifier เป็น global หรือใช้ class operation ในการเข้าถึง Object identifier ที่ถูกสร้างโดยคลาส รูปแบบอื่นๆ ของ Singleton Pattern อาจขึ้นอยู่กับสถานการณ์ตอนเริ่มต้นสร้าง instance
Singleton Design Pattern Solution สร้าง class ที่มี Class Operation ในการให้ค่า instance ของ class อาจสร้าง instance ของ class ไว้ตั้งแต่เริ่มแรกที่มีการ load class เข้ามาในระบบ หรืออาจสร้าง instance ของ class ในครั้งแรกที่มีการเรียก Class Operation เพื่อสอบถามค่า instance ของ class Consequences มีการควบคุมการเข้าถึง object instance ที่ถูก encapsulate ไว้ใน class ไม่จำเป็นต้องประกาศ name space ไว้เป็น global อาจมีการทำ subclass ของ Singleton class และให้ user สามารถเลือกว่าต้องการสร้าง subclass ใดเมื่อตอน run-time อาจมีการดัดแปลงให้มีการสร้าง instance ที่มากกว่า 1 instance ภายในคลาส ตามต้องการ
Summary What is A Pattern? Why Patterns? Software Patterns GoF Design Patterns Singleton (Object Creational Design Patterns)