设计模式之对象创建
类型的本质是一种约束。接口可以理解为一种行为类型。
画图不易,请勿转载。
对象构造类
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(); } } ```