工厂方法模式:定义一个用于创建对象的接口;
需要创建复杂对象时可使用工厂方法模式,有些对象可以直接用new的方式创建就无需用工厂模式;
类型:创建类模式
工厂模式的优点:
1)、代码结构清晰,有效的封装变化。产品类的实例化通常是复杂多变的,通过工厂模式,客户端无需关系产品类实例化过程,只需依赖工厂即可;
2)、降低产品类和调用者类的耦合度,调用者无需关心产品类的依赖类;
工厂方法模式的组成:
1)、工厂接口:定义类方法,是工厂方法模式的核心,用于与调用者交互的接口;
2)、工厂类实现:决定如何实现产品类;
3)、产品接口:定义产品的规范;
4)、产品实现:产品接口的具体实现,决定客户端的行为。
案例:
/*工厂方法接口*/
public interface Factory{
public Productor getProduct();
public Productor getProduct(string args);
}
/*工厂实现类*/
public class FactoryImp implements Factory{
public Productor getProduct(){
return new ProductorImp();
}
public Productor getProduct(String args){
return new ProductorImp(args);
}
}
/*产品接口*/
public interface Productor {
public void apple();
public void oppo();
}
/*产品实现类*/
public class ProductorImp implements Productor{
private String type;
pulic ProductorImp(){};
public Productor(String type){
this.type = type;
}
public void apple(){
System.out.println("The type is" + type);
}
public void oppo(){
System.out.println("The type is " + type);
}
}
实际上该案列可以直接用new关键字创建对象,无需采用工厂方法模式,工厂方法模式在创建复杂对象时使用比较合适;(复杂对象:我们可以理解为当创建一个对象时需要依赖许多其他对象,即需要创建其他许多对象时,可以采用工厂模式,此时工厂模式将存在的依赖关系都封装在产品类中,客户端只需要调用共场方法就可以创建需要的对象,而不需要再创建其他依赖的对象,这样实现了客户端与产品类的依赖对象的解耦);
我们来看一个例子:
class Apple{
public app(){
System.out.println("苹果");
}
}
class Orange{
public org(){
System.out.println("橙子");
}
}
class GuoLan{
private Apple app;
private Orange org;
public GuoLan(Apple app,Orange org){
this.app = app;
this.org = org;
}
public guoLan(){
System.out.println("果篮里有:"+app.app()+org.org());
}
}
public class Client{
public static void main(Sting[] args){
Apple app = new Apple();
Orange org = new Orange();
GuoLan gl = new(app,org);
gl.guoLan();
}
}
在客户段创建使用GuoLan类时,依赖Apple、Orange类,但是这两个类与客户端没有关系,此时我们可以通过工厂模式创建该对象,具体实现由上一个小例子可以写出来,这里就不具体实现了;