问题:除了使用new操作符之外,还有更多制造对象的方法。
实例化这个活动不应该总是公开的进行,初始化也会经常造成“耦合”问题。
工厂类:
package factory;
public class SimplePizzaFactory {
public Pizza createPizza(String type){
Pizza pizza = null;
if(type.equals("cheese")){
}else if(type.equals("clam")){
}else if(type.equals("veggie")){
}
return pizza;
}
}
静态工厂:利用静态方法定义一个简单的工厂。
优点:不需要使用创建对象的方法来实例化对象。
缺点:不能通过继承来改变创建方法的行为。
使用工厂来创建对象
package factory;
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory){
this.factory = factory;
}
public Pizza orderPizza(String type){
Pizza pizza;
pizza = factory.createPizza(type);
return pizza;
}
}
简单工厂:一种编程习惯,创建对象的方法通常声明为静态,比较轻量级。
新的需求:新增了许多加盟店,且每个加盟店需要加入自己个性化的处理。
工厂方法:abstract Product factoryMethod(String type)
package factory;
public abstract class PizzaStore {
public Pizza orderPizza(String type){
Pizza pizza;
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
abstract Pizza createPizza(String type);
}
工厂方法模式:所有工厂模式都用来封装对象的创建。
工厂方法模式通过让子类决定该创建对象是什么,来达到将对象创建的过程封装的目的。
工厂方法模式定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。
工厂方法让类把实例化推迟到子类。
依赖倒置原则:要依赖抽象,不要依赖具体类
需求:保持生产披萨原料的一致,建造一家生产原料的工厂,并将原料运送到各家加盟店。
package factory;
public interface PizzaIngredientFactory {
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
public Veggies[] createVeggies();
public Pepperoni createPepperoni();
public Clams createClam();
}
抽象工厂模式:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂:当你需要创建产品家族和想让制造的相关产品集合起来时,你可以使用我。
工厂方法:我可以把客户代码从需要实例化的具体类中解耦。或者你目前还不知道将来需要实例化那些具体类时,
也可以用我。我的使用方式很简单,只要把我继承子类,并实现我的工厂方法就可以了。