设计模式之工厂方法模式

时间:2022-05-12 18:48:47
序:在设计模式中,所谓的“实现一个接口”并“不一定”表示写一个类,并利用implements关键子来实现某个java接口。“实现一个接口”泛指实现某个“超类型  (可以是类或接口) ”的某个方法。--------引自《Heard First 设计模式》
GoF为工厂方法模式給出定义如下:
Define an interface for creating an object,but let subclasss decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses
为创建对象定义一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类。
工厂方法模式是对实例化过程进行封装而形成的,客户对象无需关心实例化这些类的细节,把它们交给工厂类(工厂类定义了工厂接口)。
类图如下:

设计模式之工厂方法模式
工厂方法的结构如下:
abstract Product factoryMethod(String type);
说明:工厂方法是用来创建对象的,并将这样的行为封装在子类中,这样,客户程序中关于超类的代码和子类对象创建代码解耦
 注意项:
     1.工厂方法是抽象的,所有依赖子类来处理对象的创建
     2.工厂方法必须返回一个产品,超类中定义的方法,通常会使用到工厂发放返回的值
     3.工厂方法中的参数不是必须的。
代码如下:
/**
* 定义工厂方法类
* @author jiazq
*
*/
public abstract class MobilePhoneStore {

/***
* 超类中,不知道生产什么类型的手机
* 它只知道,对手机进行组装,系统安装,与测试等
* 所有子类可以共享统一的订制流程
* @param type
* @return
*/
public MobilePhone orderPhone(PhoneType type) {
MobilePhone phone =createPhone(type);
phone.prepare();
phone.assemble();
phone.installSystem();
phone.finalTest();
return phone;

}
/**
* 通过一个抽象方法,让子类实现
*
* @param type
* @return
*/
abstract MobilePhone createPhone(PhoneType type);

}
/** * iphone 商店销售 4s,5s,6 * @author Administrator * */public class IPhoneStore extends MobilePhoneStore{ @Override MobilePhone createPhone(PhoneType type) {  MobilePhone phone;  if(type.equals(PhoneType.iphone4s)){   phone = new IPhone4s();  }else if(type.equals(PhoneType.iphone5s)){   phone = new IPhone5s();  }else if(type.equals(PhoneType.iphone6)){   phone = new IPhone6();  }else{   return null;  }  return phone; }}

/**
* 魅族商店
* @author Administrator
*
*/
public class MeiZuStore extends MobilePhoneStore{

@Override
MobilePhone createPhone(PhoneType type) {
MobilePhone phone;
if(type.equals(PhoneType.Mx3)){
phone = new Mx3Phone();
}else if(type.equals(PhoneType.Mx4)){
phone = new Mx4Phone();
}else{
return null;
}
return phone;
}

}

具体手机类型大致不变,这里描述一项
public class Mx3Phone extends MobilePhone {

public Mx3Phone() {
this.name="Mx3";
this.money=1299;
}

@Override
public void assemble() {
System.out.println(".....进行Mx3的组装.....");

}

@Override
public void finalTest() {

System.out.println(".....Mx3测试通过.....");
}

@Override
public void installSystem() {
System.out.println("安装Mx3的安卓系统");

}

@Override
public void prepare() {
System.out.println(".....准备Mx3的配件.....");

}
}
再看外部测试代码
/***
* 外部测试类
*
* @author jiazq
*
*/
public class FactoryTest {
public static void main(String args[]) {

MobilePhoneStore mStore = new MeiZuStore();
MobilePhone mx3 = mStore.orderPhone(PhoneType.Mx3);
System.out.println("帅兵订制的手机是:" + mx3.getName() + "¥:" + mx3.getMoney());

MobilePhoneStore iStore = new IPhoneStore();

MobilePhone iphone6 = iStore.orderPhone(PhoneType.iphone6);

System.out.println("攀儿订制的手机是:" + iphone6.getName() + "¥:"
+ mx3.getMoney());

}

}
//TODO 代码UML类图
运行结果:
设计模式之工厂方法模式