设计模式02-工厂方法模式
1.概念
定义一个创建产品对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。
2.UML
3.实例
实例1.
首先是抽象产品类
package com.mageric.test; /** * 抽象产品类 * * @author Mageric * */ public interface IBiology { public void Create(); public void Grow(); }
接下来是两个具体的产品类
/** * 具体产品-动物类 * * @author Mageric * */ public class CAnimal implements IBiology { @Override public void Create() { // TODO Auto-generated method stub System.out.println("A Animal has been Created"); } @Override public void Grow() { // TODO Auto-generated method stub System.out.println("The Animal has grown"); } }
/** * 具体产品-植物类 * @author Mageric * */ public class CPlant implements IBiology { @Override public void Create() { // TODO Auto-generated method stub System.out.println("A Plant has been Created"); } @Override public void Grow() { // TODO Auto-generated method stub System.out.println("The Plant has grown"); } public void Die() { // TODO Auto-generated method stub System.out.println("The Plant has died"); } }
抽象工厂类
/** * 抽象工厂类 * @author Mageric * */ public interface IFactory { IBiology Generate(); }
两个具体的产品工厂类
/** * 具体产品工厂类-动物工厂 * @author Mageric * */ public class CAnimalFactory implements IFactory { @Override public IBiology Generate() { // TODO Auto-generated method stub return new CAnimal(); } }
/** * 具体产品工厂类-植物工厂 * * @author Mageric * */ public class CPlantFactory implements IFactory { @Override public IBiology Generate() { // TODO Auto-generated method stub return new CPlant(); } }
客户端调用:
/*** * 客户端 * * @author Mageric * */ public class Client { public static void main(String[] args) { // TODO Auto-generated method stub IFactory factory1 = new CAnimalFactory(); IBiology animal = factory1.Generate(); animal.Create(); animal.Grow(); IFactory factory2 = new CPlantFactory(); IBiology plant = factory2.Generate(); plant.Create(); plant.Grow(); } }
4.优缺点
优点:工厂方法模式中,用户只需要知道所要生产产品的具体工厂,无需关心具体过程,也不需要知道具体的产品类。当需要添加一个新的具体产品时,只需要添加一个对应的产品类和对应的产品工厂,而不需要对原有的工厂进行修改,符合“开放-封闭原则”
缺点:每增加一个产品就需要对应增加相应的产品工厂,一定程度上增加了系统的复杂性,同时增加了系统具体类的依赖性
5.实际应用
在以下情况下,适用于工厂方法模式:
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。