工厂模式就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。
1、简单工厂模式属于创建型模式,是工厂模式的一种,简单工厂模式由一个工厂对象创建出哪一种产品的实列,简单工厂模式是工厂模式里面最简单实用的模式。在简单工厂模式里面定义了一个创建对象的类,由这个类来封装实例化对象的行为。
我们通过制作手机的代码演示简单工厂模式:
1、定义制作手机规范:
/** * 定义制作手机的规范 * @author Administrator * */ public abstract class Phone {
/** * 制作手机的方法 */ public abstract void make(); }
2、编写制作具体手机的方法:
public class HuaWeiPhone extends Phone{
@Override public void make() { System.out.println("制作华为手机"); } }
public class XiaoMiPhone extends Phone{
@Override public void make() { System.out.println("制作小米手机"); }
}
3、手机生产的工厂
public class PhoneFactory {
/** * 制作手机的工厂方法 * @param orderType */ public Phone createPhone(String orderType) { Phone phone = null; if(orderType.equals("xiaomi")) { phone = new XiaoMiPhone(); }else if(orderType.equals("huawei")) { phone = new HuaWeiPhone(); } return phone; } } 4、定义根据工厂来获取到具体的手机信息:
public class PhoneOrder { public PhoneOrder(PhoneFactory factory) { phone(factory); } private void phone(PhoneFactory factory) { Phone phone = null; String orderType = null; while(true) { orderType = this.getType(); phone = factory.createPhone(orderType); if(phone != null) { phone.make(); }else { System.out.println("制作手机失败"); break; } } }
// 写一个方法,制造手机的种类 private String getType() { try { BufferedReader strin = new BufferedReader(new InputStreamReader(System.in)); System.out.println("input phone 种类:"); String str = strin.readLine(); return str; } catch (IOException e) { e.printStackTrace(); return ""; } } }
5、测试手机生产的业务
public class MakePhone {
public static void main(String[] args) { new PhoneOrder(new PhoneFactory()); } }
2、工厂方法模式
在制作手机的基础上增加新的需求,需要在不同的地方开设工厂来生产手机,我们使用简单工厂模式需要创建不同的地区工厂类,这样不利于系统的维护性和扩展性。
使用简单工厂方法来对新需求进行重新设计,将生产手机的方法定义为一个抽象方法,具体细节交由子类去实现,工厂方法模式将实列化推向子类来处理。
具体代码演示:
1、定义生产手机的规范
public abstract class Phone {
/** * 制作手机的方法 */ public abstract void make(); }
2、根据该规范来生产手机:
public class GZHuaweiPhone extends Phone{
@Override public void make() { System.out.println("广州生产华为手机"); } } public class GZXiaomiPhone extends Phone{ @Override public void make() { System.out.println("广州生产小米手机"); } }
public class ZZXiaoMiPhone extends Phone{ @Override public void make() { System.out.println("郑州生产小米手机"); } } public class ZZHuaWeiPhone extends Phone{ @Override public void make() { System.out.println("郑州生产华为手机"); } }
3、定义抽象类,定义生产手机细节的抽象方法。
public abstract class PhoneOrder {
public abstract Phone createPhone(String orderType); public PhoneOrder() { Phone phone = null; String orderType = null; while(true) { orderType = this.getType(); phone = createPhone(orderType); if(phone != null) { phone.make(); }else { System.out.println("生产手机失败"); break; } } } private String getType() { try { BufferedReader strin = new BufferedReader(new InputStreamReader(System.in)); System.out.println("input phone 种类:"); String str = strin.readLine(); return str; } catch (IOException e) { e.printStackTrace(); return ""; } } }
4、实现抽象方法,生产手机细节的落地实现:
/** * 郑州生产基地 * @author Administrator * */ public class ZZPhoneOrder extends PhoneOrder {
@Override public Phone createPhone(String orderType) { Phone phone = null; if(orderType.equals("xiaomi")) { phone = new ZZXiaoMiPhone(); }else if(orderType.equals("huawei")) { phone = new ZZHuaWeiPhone(); } return phone; } }
/** * 广州基地生产手机 * @author Administrator * */ public class GZPhoneOrder extends PhoneOrder {
@Override public Phone createPhone(String orderType) { Phone phone = null; if(orderType.equals("xiaomi")) { phone = new GZXiaomiPhone(); }else if(orderType.equals("huawei")) { phone = new GZHuaweiPhone(); } return phone; } 5、测试方法来测试通过工厂方法来测试手机生产的业务
public class MakePhone {
public static void main(String[] args) { //new ZZPhoneOrder(); new GZPhoneOrder(); } }
3、抽象工厂模式,定义一个interface用于创建相关或者有依赖的对象,而无需指明具体的类。
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合,从设计层面看抽象工厂模式就是对简单工厂模式的改进。
将工厂分为两层,抽象工厂和具体的实现子类,程序员可以根据创建对象类型和使用对于的工厂子类,这样就将单个的简单工厂类变成了工厂族,更利代码的维护和扩展。
具体代码演示:
1、制作手机的规范
public abstract class Phone { /** * 制作手机的方法 */ public abstract void make(); }
2、制作手机的落地实现
public class GZHuaweiPhone extends Phone{ @Override public void make() { System.out.println("广州生产华为手机"); } }
public class GZXiaomiPhone extends Phone{ @Override public void make() { System.out.println("广州生产小米手机"); } }
public class ZZHuaWeiPhone extends Phone{ @Override public void make() { System.out.println("郑州生产华为手机"); } }
public class ZZXiaoMiPhone extends Phone{ @Override public void make() { System.out.println("郑州生产小米手机"); } } 3、创建工厂类,创建手机的接口,具体细节有实现去完成
public interface AbsFactory {
//创建手机的接口方法 public Phone create(String orderType); }
4、工厂类的具体实现细节
public class GZPhoneOrder implements AbsFactory{ //广州基地生产手机 @Override public Phone create(String orderType) { Phone phone = null; if(orderType.equals("xiaomi")) { phone = new GZXiaomiPhone(); }else if(orderType.equals("huawei")) { phone = new GZHuaweiPhone(); } return phone; }
}
public class ZZPhoneOrder implements AbsFactory{ //郑州基地生产手机 @Override public Phone create(String orderType) { Phone phone = null; if(orderType.equals("xiaomi")) { phone = new ZZXiaoMiPhone(); }else if(orderType.equals("huawei")) { phone = new ZZHuaWeiPhone(); } return phone; } }
5、定义根据工厂方法来获取具体手机的方法:
public class PhoneOrder { public PhoneOrder(AbsFactory factory) { setFactory(factory); } private void setFactory(AbsFactory factory) { Phone phone = null; String orderType = null; while(true) { orderType = this.getType(); phone = factory.create(orderType); if(phone != null) { phone.make(); }else { System.out.println("手机生产失败"); break; } } } private String getType() { try { BufferedReader strin = new BufferedReader(new InputStreamReader(System.in)); System.out.println("input phone 种类:"); String str = strin.readLine(); return str; } catch (IOException e) { e.printStackTrace(); return ""; } } }
6、测试
public class MakePhone {
public static void main(String[] args) { //new PhoneOrder(new GZPhoneOrder()); new PhoneOrder(new ZZPhoneOrder()); } }
工厂模式使用细节:
工厂模式的意义是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖和解耦,从而提高项目的扩展性和维护性。 一共三种模式(简单工厂模式、工厂方法模式、抽象工厂模式) 设计模式的依赖抽象原则:1、创建对象实列时,不要直接new,而是把这个new类的动作放到一个工厂的方法中。2、不要让类继承具体类,而是继承抽象类或者实现具体的接口。3、不要覆盖基类原有的方法。