工厂方法模式:
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类。
工厂方法模式结构:
工厂方法模式一般有四个部分:抽象产品类、具体产品类、抽象工厂类、具体工厂类。
- 抽象产品类:负责定义产品的共性,实现对事物最抽象的定义;
- 具体产品类:继承抽象产品类,定制特色产品;
- 抽象工厂类:负责定义产品的产生,以及对产品的操作;
- 具体产品类:创建具体的产品。
工厂方法模式就是对使用new直接创建对象的一种替代方法,因为直接创建对象可能使得程序维护性差,if-else语句过多等弊端。
代码示例:
抽象产品类:
public abstract class Product { public abstract void name(){} public abstract void prise();
}
具体产品类:
public class Product1 extends Product {//实现抽象类的方法
}
public class Product2 extends Product {//实现抽象类的方法
}
抽象工厂类:
public abstract class Cracter{//定义工厂方法,实例化产品由具体工厂实现public abstract <T extends Product> T createProduct(Class<T> c); //可以添加对产品对象公有的操作...
}
具体工厂类:
public class MyCracter extends Cracter{public <T extends Product> T createProduct(Class<T> c){ Product product=null; try { product = (Product)Class.forName(c.getName()).newInstance(); } catch (Exception e) { //异常处理 } return (T)product; }
}
使用场景:
public class Client {public static void main(String[] args) {Creator creator = new ConcreteCreator();Product product = creator.createProduct(Product1.class);//其他操作...}
}
使用上面的这种工厂方法模式的优点是显而易见的:
- 将创建产品对象和对产品对象的操作分离。
- 扩展性非常优秀。以后要想添加新的产品类,只需简单的创建产品类,其他地方都不需要改变。
- 屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,它只需要关心产品的接口,只要接口保持不变,系统中的上层模块就不要发生变化。
设计原则--依赖倒置原则----要依赖抽象,不要依赖具体类。
下面的指导方针可以帮你避免违反依赖倒置原则:
- 变量不可以持有具体类的引用
- 不要让类派生自具体类
- 不要覆盖基类中已实现的方法
要点:
- 工厂方法使用继承:把对象的创建交给子类,子类实现工厂方法来创建对象。
- 通过减少应用程序和具体类之间的依赖出尽松耦合。
- 工厂方法允许将实例化延长到子类进行。
下一篇----抽象工厂模式