1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN

50 1,2K 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 50
Dung lượng 525,51 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ý nghĩaAbstract Factory cung cấp một giao diện lớp có chức năng tạo ra một tập hợp các đối tượng liên quan hoặc phụ thuộc lẫn nhau mà không chỉ ra đó là những lớp cụ thể nào tại thời điể

Trang 1

HỌC VIÊN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

Trang 2

public void draw() {

System.out.println(" day la mau do");

}}

Blue.java

public class blue implements color{

@Override

public void draw() {

System.out.println("day la mau xanh");

}}

colorFactory.java

public class ColorFactory {

Trang 3

//use getShape method to get object of type shape public color getColor(String ColorType) {

public static void main(String[] args) {

// TODO code application logic here

ColorFactory factorty=new ColorFactory(); color col=factorty.getShape("red");

Trang 4

2 Ý nghĩa

Abstract Factory cung cấp một giao diện lớp có chức năng tạo ra một tập hợp các đối tượng liên quan hoặc phụ thuộc lẫn nhau mà không chỉ ra đó là những lớp cụ thể nào tại thời điểm thiết kế

3 Ứng dụng

-Phía trinh khách sẽ không phụ thuộc vào việc những sản phẩm được tạo ra như thế nào-Ứng dụng sẽ được cấu hình với một hoặc nhiều họ sản phẩm

-Các đổi tượng cần phải được tạo ra như một tập hợp để có thể tương thích với nhau

-Cung cấp một tập các lớp và muốn thể hiện các ràng buộc các quan hệ giữa chúng mà không phải là thực thi của chúng

4 Chương trình minh họa

public void draw() {

System.out.println("day la hinh chu nhat");

public void draw() {

System.out.println("day la hinh oval");

}

}

Trang 5

public void draw() {

System.out.println(" day la mau do");

}}

Blue.java

public class blue implements color{

@Override

public void draw() {

System.out.println("day la mau xanh");

}}

AbstrachFactory.java

public abstract class AbstractFactory {

abstract Color getColor(String color);

abstract Shape getShape(String shape) ;

}

FactoryProducer.java

public class FactoryProducer {

public static AbstractFactory getFactory(String choice){

public static void main(String[] args) {

// TODO code application logic here

AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");

Trang 6

shape shape1 = shapeFactory.getShape("OVAL");

shape1.draw();

shape shape2 = shapeFactory.getShape("RECTANGLE");

shape2.draw();

AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");

color color1 = colorFactory.getColor("RED");

Singleton Pattern đảm bảo một lớp chỉ có một thực thể (instance) duy nhất được tạo ra

và đồng thời cung cấp một truy cập toàn cục đến đối tượng được tạo ra.

3 Ứng dụng

Trang 7

Chúng ta nên sử dụng Singleton trong trường hợp quản lý một loại dịch vụ nào đó, nên dùng chung giữa các màn hình:

4 Chương trình minh họa

SingleObject.java

public class SingleObject {

private static SingleObject instance = new SingleObject();

private SingleObject(){

public static SingleObject getInstance(){

return instance;

}

public void showMessage(){

System.out.println("This is singleton pattern!");

public static void main(String[] args) {

SingleObject object = SingleObject.getInstance();

Trang 8

Một trường hợp nơi Builder có thể có ích khi xây dựng một bộ tạo code Giả sử bạn đang viết một ứng dụng viết các stored procedure cho các CSDL khác nhau (SQL Server, Oracle, DB2) Đầu ra thực sự thì rất khác nhau nhưng những bước khác nhau của việc tạo các procedure tách biệt thực thi các trạng thai CRUD (Create, Read, Update, Delete) là tương tự nhau.

Builder là một mẫu thiết kế tạo lập tương tự như các mẫu Factory Tuy nhiên, Builder cho bạn nhiều sự kiểm soát hơn trong từng bước trong tiến trình xây dựng có thể được tùy chỉnh; các mẫu Factory tạo ra các đối tượng trong 1 bước duy nhất

4 Chương trình minh họa

Item.java

public interface Item {

public String name();

public Packing packing();

public float price();

}

Packing.java

public interface Packing {

Trang 9

public String pack();

public Packing packing() {

return new Wrapper();

public Packing packing() {

return new Bottle();

Trang 10

public class VegBurger extends Burger {

public String name() {

return "Veg Burger";

public String name() {

return "Chicken Burger";

Trang 11

public float price() {

public class Meal {

private List<Item> items = new ArrayList<Item>();

public void addItem(Item item){

public void showItems(){

for (Item item : items) {

public class MealBuilder {

public Meal prepareVegMeal (){

Meal meal = new Meal();

Trang 12

Meal meal = new Meal();

public static void main(String[] args) {

MealBuilder mealBuilder = new MealBuilder();

Meal vegMeal = mealBuilder.prepareVegMeal();

System.out.println("Veg Meal");

vegMeal.showItems();

System.out.println("Total Cost: " +vegMeal.getCost());

Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); System.out.println("\n\nNon-Veg Meal");

Trang 13

(Geographic Information Systems) và các trò chơi.

4 Chương trình minh họa

Shape.java

public abstract class Shape implements Cloneable {

private String id;

protected String type;

Trang 14

public Object clone() {

Object clone = null;

public void draw() {

System.out.println("Inside Rectangle::draw() method."); }

public void draw() {

System.out.println("Inside Square::draw() method."); }

}

ShapeCache.java

public class ShapeCache {

private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>();

Trang 15

public static Shape getShape(String shapeId) {

Shape cachedShape = shapeMap.get(shapeId);

return (Shape) cachedShape.clone();

}

// for each shape run database query and create shape

// shapeMap.put(shapeKey, shape);

// for example, we are adding three shapes

public static void loadCache() {

Trang 16

3 Ứng dụng

Khi ta muốn chuyển đổi một lớp với một giao diện thành giao diện mà ta mong muốn Xậy dựng, mở rộng các phương thức của lớp có sẵn phù hợp với yêu cầu.

Tái sử dụng giao diện cũ Giảm thiểu việc viết lại mã lệnh.

4 Chương trình minh họa

MediaPlayer.java

public interface MediaPlayer {

public void play(String audioType, String fileName);

}

AdvancedMediaPlayer.java

public interface AdvancedMediaPlayer {

public void playVlc(String fileName);

public void playMp4(String fileName);

}

Trang 17

public class VlcPlayer implements AdvancedMediaPlayer{ @Override

public void playVlc(String fileName) {

System.out.println("Playing vlc file Name: "+ fileName); }

public void playMp4(String fileName) {

System.out.println("Playing mp4 file Name: "+ fileName); }

Trang 18

public void play(String audioType, String fileName) {

//inbuilt support to play mp3 music files

public static void main(String[] args) {

AudioPlayer audioPlayer = new AudioPlayer();

audioPlayer.play("mp3", "beyond the horizon.mp3");

audioPlayer.play("mp4", "alone.mp4");

audioPlayer.play("vlc", "far far away.vlc");

audioPlayer.play("avi", "mind me.avi");

}

}

Trang 19

Mẫu thiết kế Bridge được sử dụng để tách một abstraction khỏi implementation của nó

để cả hai có thể thay đổi đôc lập nhau Bridge là một trong những mẫu thiết kế cấu trúc mức cao và mục tiêu chính của nó là thông qua abstraction giúp cho các lập trình viên viết code tốt hơn Một mẫu thiết kế Bridge được tạo ra bằng cách di chuyển một tập các abstract operation sang một interface để cả client và dịch vụ có thể thay đổi mà không phụ thuộc lẫn nhau.

4 Chương trình minh họa

DrawAPI.java

public interface DrawAPI {

public void drawCircle(int radius, int x, int y);

}

RedCircle.java

Trang 20

public class RedCircle implements DrawAPI {

@Override

public void drawCircle(int radius, int x, int y) {

System.out.println("Drawing Circle[ color: red, radius: " + radius +", x: " +x+", "+ y +"]");

public void drawCircle(int radius, int x, int y) {

System.out.println("Drawing Circle[ color: green, radius: " + radius +", x: " +x+", "+ y +"]");

}

}

Shape.java

public abstract class Shape {

protected DrawAPI drawAPI;

protected Shape(DrawAPI drawAPI){

public class Circle extends Shape {

private int x, y, radius;

public Circle(int x, int y, int radius, DrawAPI drawAPI) { super(drawAPI);

Trang 21

*/

public static void main(String[] args) {

Shape redCircle = new Circle(100,100, 10, new RedCircle());

Shape greenCircle = new Circle(100,100, 10, new GreenCircle());

public class Employee {

private String name;

private String dept;

private int salary;

private List<Employee> subordinates;

// constructor

public Employee(String name,String dept, int sal) {

Trang 22

public String toString(){

return ("Employee :[ Name : "+ name

+", dept : "+ dept + ", salary :"

public static void main(String[] args) {

Employee CEO = new Employee("John","CEO", 30000);

Employee headSales = new Employee("Robert","Head Sales", 20000);

Employee headMarketing = new Employee("Michel","Head Marketing", 20000); Employee clerk1 = new Employee("Laura","Marketing", 10000);

Employee clerk2 = new Employee("Bob","Marketing", 10000);

Trang 23

Employee salesExecutive1 = new Employee("Richard","Sales", 10000); Employee salesExecutive2 = new Employee("Rob","Sales", 10000);

Trang 24

2 Ý nghĩa

Cho phép thêm một phương thức (method) hoặc thuộc tính (field, property) vào một đối tượng có sẵn một cách linh động

Về bản chất, design pattern này sẽ tạo ra một lớp bao trùm lên đối tượng đã tồn tại, và khi

sử dụng lớp mới này, ta có thể truy xuất các thuộc tính của đối tượng cũ cũng như có thêm những phương thức và thuộc tính mới ở lớp mới vừa được tạo ra

3 Ứng dụng

Động cơ của mẫu thiết kế Decorator là cho bạn mở rộng một hành vi của đối tượng một cách linh hoạt Khả năng này là để gán hành vi mới một cách linh hoạt cho các đối tượng được thực hiện bới một lớp Decorator.

Mẫu thiết kế Decorator kết hợp tính đa hình với quyền ủy thác (delegation) Đó là tính

đa hình với lớp gốc để cho các client có thể thực thi nó như lớp gốc Trong hầu hết các trường hợp, những lời gọi phương thức được ủy thác cho lớp gốc và sau đó các kết

quả được thực hiện bên trên, hoặc được decorate, với chức năng bổ sung Decoration

là một kỹ thuật linh hoạt vì nó thực hiện vào lúc runtime.

4 Chương trình minh họa

Trang 25

public class RedShapeDecorator extends ShapeDecorator {

public RedShapeDecorator(Shape decoratedShape) { super(decoratedShape);

Trang 26

public static void main(String[] args) {

Shape circle = new Circle();

Shape redCircle = new RedShapeDecorator(new Circle());

Shape redRectangle = new RedShapeDecorator(new Rectangle()); System.out.println("Circle with normal border");

circle.draw();

System.out.println("\nCircle of red border");

redCircle.draw();

System.out.println("\nRectangle of red border");

redRectangle.draw(); // TODO code application logic here

Trang 27

2 Ý nghĩa

Sử dụng việc chia sẻ để giúp cho việc xử lý các đối tượng lớn một cách hiệu quả

Một mẫu flyweight là một đối tượng chia sẻ mà có thể sử dụng trong đồng thời nhiều ngữ cảnh Mẫu flyweight hoạt động như một đối tượng độc lập trong mỗi thời điểm

3 Ứng dụng

Mục tiêu của mẫu thiết kế Flyweight là để chia sẻ nhiều đối tượng fine-grained một cách hiệu quả Các đối tượng flyweight được chia sẻ là bất biến, chúng không thể bị thay đổi vi chúng mô tả các tính chất được chia sẻ với các đối tượng khác Một số ví dụ

như các kí tự và line-style trong word processor hoặc các digit receiver trong một các

ứng dụng mạng điện thoại chuyển đổi công cộng Flyweight hiếm khi nào được sử dụng trong các ứng dụng nghiệp vụ hướng dữ liệu (data-driven business type

public class Circle implements Shape {

private String color;

private int x;

private int y;

private int radius;

public Circle(String color){

Trang 28

public void draw() {

System.out.println("Circle: Draw() [Color : " + color

+", x : " + x +", y :" + y +", radius :" + radius);

}

}

ShapeFactory.java

public class ShapeFactory {

private static final HashMap<String, Shape> circleMap = new HashMap();

public static Shape getCircle(String color) {

Circle circle = (Circle)circleMap.get(color);

public class FlyWeightPattern {

private static final String colors[] =

{ "Red", "Green", "Blue", "White", "Black" };

public static void main(String[] args) {

for(int i=0; i < 20; ++i) {

Trang 29

}

private static String getRandomColor() {

return colors[(int)(Math.random()*colors.length)]; }

private static int getRandomX() {

Trang 30

XI Proxy Pattern

public class RealImage implements Image {

private String fileName;

public RealImage(String fileName){

Trang 31

System.out.println("Loading " + fileName);

}

}

ProxyImage.java

public class ProxyImage implements Image{

private RealImage realImage;

private String fileName;

public ProxyImage(String fileName){

public static void main(String[] args) {

Image image = new ProxyImage("test_10mb.jpg");

//image will be loaded from disk

image.display();

System.out.println("");

//image will not be loaded from disk

image.display(); // TODO code application logic here }

}

Trang 32

-Giúp các đối tượng khác nhau hoạt động riêng rẽ trong một chương trình

-Hạn chế liên kết giữa 2 đối tượng một cách độc lập

-có nhiều đối tượng với nhiều phương thức khác nhau thích hợp với hành động mà chương trình đang yêu cầu nó sẽ chọn phương thức thích hợp nhât

4 Chương trình minh họa

AbstractLogger.java

public abstract class AbstractLogger {

public static int INFO = 1;

public static int DEBUG = 2;

public static int ERROR = 3;

protected int level;

//next element in chain or responsibility

protected AbstractLogger nextLogger;

Trang 33

public void setNextLogger(AbstractLogger nextLogger){

public class ConsoleLogger extends AbstractLogger {

public ConsoleLogger(int level){

this.level = level;

}

@Override

protected void write(String message) {

System.out.println("Standard Console::Logger: " + message); }

}

ErrorLogger.java

public class ErrorLogger extends AbstractLogger {

public ErrorLogger(int level){

this.level = level;

}

@Override

protected void write(String message) {

System.out.println("Error Console::Logger: " + message); }

}

FileLogger.java

public class FileLogger extends AbstractLogger {

Trang 34

public FileLogger(int level){

public class ChainofresponsibiltyPattern {

private static AbstractLogger getChainOfLoggers(){

AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR); AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG); AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);

errorLogger.setNextLogger(fileLogger);

fileLogger.setNextLogger(consoleLogger);

return errorLogger;

}

public static void main(String[] args) {

AbstractLogger loggerChain = getChainOfLoggers();

Ngày đăng: 30/03/2015, 21:22

HÌNH ẢNH LIÊN QUAN

1. Sơ đồ mẫu - Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN
1. Sơ đồ mẫu (Trang 2)
1. Sơ đồ mẫu - Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN
1. Sơ đồ mẫu (Trang 3)
1. Sơ đồ mẫu - Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN
1. Sơ đồ mẫu (Trang 6)
1. Sơ đồ mẫu - Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN
1. Sơ đồ mẫu (Trang 13)
1. Sơ đồ mẫu - Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN
1. Sơ đồ mẫu (Trang 21)
1. Sơ đồ mẫu - Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN
1. Sơ đồ mẫu (Trang 26)
1. Sơ đồ mẫu - Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN
1. Sơ đồ mẫu (Trang 32)
1. Sơ đồ mẫu - Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN
1. Sơ đồ mẫu (Trang 35)
1. Sơ đồ mẫu - Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN
1. Sơ đồ mẫu (Trang 45)
1. Sơ đồ mẫu - Bài tiểu luận KIẾN TRÚC VÀ THIẾT KẾ PHẦN MỀM FACTORY PATTERN
1. Sơ đồ mẫu (Trang 47)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w