设计模式之对象创建

分类: DESIGN PATTERN 发布于:

类型的本质是一种约束。接口可以理解为一种行为类型。

画图不易,请勿转载。

对象构造类

singleton(单一状态模式)

利用静态方法,从内存直取。

prototype(原型)

/** Prototype Class **/
 public class Cookie implements Cloneable {
   
    public Object clone() throws CloneNotSupportedException
    {
        //In an actual implementation of this pattern you would now attach references to
        //the expensive to produce parts from the copies that are held inside the prototype.
        return (Cookie) super.clone();
    }
 }
 
 /** Concrete Prototypes to clone **/
 public class CoconutCookie extends Cookie { }
 
 /** Client Class**/
 public class CookieMachine
 {
 
   private Cookie cookie;//cookie必须是可复制的
 
     public CookieMachine(Cookie cookie) { 
         this.cookie = cookie; 
     } 

    public Cookie makeCookie()
    {
        try
        {
            return (Cookie) cookie.clone();
        } catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return null;
    } 

 
     public static void main(String args[]){ 
         Cookie tempCookie =  null; 
         Cookie prot = new CoconutCookie(); 
         CookieMachine cm = new CookieMachine(prot); //设置原型
         for(int i=0; i<100; i++) 
             tempCookie = cm.makeCookie();//通过复制原型返回多个cookie 
     } 
 }

## 工厂方法

 ![](/assets/images/design_patterns_factory_method.png)

//Button类 class Button{/* …/} class WinButton extends Button{//} class MacButton extends Button{/ …*/}

//工厂类 interface ButtonFactory{ abstract Button createButton(); } class WinButtonFactory implements ButtonFactory{ Button createButton(){ return new WinButton(); } } class MacButtonFactory implements ButtonFactory{ Button createButton(){ return new MacButton(); } }


## 抽象工厂

![](/assets/images/design_patterns_abstract_factory.png)

public interface Button {} public interface Border {}

public class MacButton implements Button {} public class MacBorder implements Border {}

public class WinButton implements Button {} public class WinBorder implements Border {}

public class MacFactory { public static Button createButton() { return new MacButton(); } public static Border createBorder() { return new MacBorder(); } }

public class WinFactory { public static Button createButton() { return new WinButton(); } public static Border createBorder() { return new WinBorder(); } }


## Builder(建造、生成器)

![](/assets/images/design_patterns_builder.png)

/** “Product” */ class Pizza { private String dough = “”; private String sauce = “”; private String topping = “”;

public void setDough (String dough) { this.dough = dough; } public void setSauce (String sauce) { this.sauce = sauce; } public void setTopping (String topping) { this.topping = topping; } }

’’/** “Abstract Builder” */’’ abstract class PizzaBuilder { protected Pizza pizza;

public Pizza getPizza() { return pizza; } public void createNewPizzaProduct() { pizza = new Pizza(); }

public abstract void buildDough(); public abstract void buildSauce(); public abstract void buildTopping(); }

/** “ConcreteBuilder” */ class HawaiianPizzaBuilder extends PizzaBuilder { public void buildDough() { pizza.setDough(“cross”); } public void buildSauce() { pizza.setSauce(“mild”); } public void buildTopping() { pizza.setTopping(“ham+pineapple”); } }

/** “ConcreteBuilder” */ class SpicyPizzaBuilder extends PizzaBuilder { public void buildDough() { pizza.setDough(“pan baked”); } public void buildSauce() { pizza.setSauce(“hot”); } public void buildTopping() { pizza.setTopping(“pepperoni+salami”); } }

’’/** “Director” */’’ class Waiter { private PizzaBuilder pizzaBuilder;

public void setPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; } public Pizza getPizza() { return pizzaBuilder.getPizza(); }

public void constructPizza() { pizzaBuilder.createNewPizzaProduct(); pizzaBuilder.buildDough(); pizzaBuilder.buildSauce(); pizzaBuilder.buildTopping(); } }

/** A customer ordering a pizza. */ class BuilderExample { public static void main(String[] args) { Waiter waiter = new Waiter(); PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder(); PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();

 waiter.setPizzaBuilder ( hawaiian_pizzabuilder );
 waiter.constructPizza();
 
 Pizza pizza = waiter.getPizza();    }  }  ```