2011年3月23日

Factory Method Pattern(工廠模式)

  • Definition
  • The Factory Method Pattern defines an interface for creating an object, but lets subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
    
  • Class Diagram
  • Product Role
  • public abstract class Product {
        public void method1() {
        //doSomething
        }
    
    public abstract void method2() ;
    
    }
    
  • ConcreteProduct Role
  • public ConcreteProduct1 extend Product {
        public void method2() {
            //doSomething
        }
    }
    
    public ConcreteProduct2 extend Product {
        public void method2() {
            //doSomething
        }
    }
    
  • Creator Role
  • public abstract class Creator {
        public abstract <T extends Product> T createProduct(Class<T> c);
    }
    
  • ConcreteCreator Role
  • public class ConcreteCreator extends Creator {
        public <T extends Product> T createProduct(Class<T> c) {
            Product product=null;
            try {
                product = (Product)Class.forName(c.getName()).newInstance();
            } catch (Exception e) {
                //error process
            }
            Return (T)product;
        }
    }
    
  • Client Role
  • public class Client {
        public static void main(String[] args) {
            Creator creator = new ConcreteCreator();
            Product product = creator.creatorProduct(ConcreteProduct1.class);
            //doSomething
        }
    }
    

2011年3月2日

Decorator Pattern(裝飾模式)

  • Definition
  • The Decorator Pattern attaches additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
    
  • Class Diagram
  • Component Role
  • public abstract class Component {
        public abstract void operate();
    }
    
  • ConcreteComponent Role
  • public class ConcreteComponent extends Component {
        @Override
        public void operate() {
            System.out.println("do Something");
        }
    }
    
  • Decorator Role
  • 
    public abstract class Decorator extends Component {
        private Component _component;
        
        public Decorator(Component component) {
            this._component = component;
        }
    
        @Override
        public void operate() {
            this._component.operate();
        }
    }
    
  • ConcreteDecorator Role
  • public class ConcreteDecorator1 extends Decorator {
    
        public ConcreteDecorator1(Component component)
            super(component);
        }
    
        private void method1() {
            System.out.println("method1 Decorator");
        }
    
        public void operate() {    
            this.method1();
            super.operate();
        }
    }
    
    public class ConcreteDecorator2 extends Decorator {
    
        public ConcreteDecorator2(Component component)
            super(component);
        }
    
        private void method2() {
            System.out.println("method2 Decorator");
        }
    
        public void operate() {    
            this.method2();
            super.operate();
        }
    }
    
  • Client Role
  • public class Client {
        public static void main(String[] args) {
            Component component = new ConcreteComponent();
            component = new ConcreteDecorator1(component);
             component = new ConcreteDecorator2(component);
            component.operate();
        }
    }