简单工厂模式

x33g5p2x  于2022-03-05 转载在 其他  
字(1.8k)|赞(0)|评价(0)|浏览(273)

1.概念

提供一个创建对象实例的功能,而无需关心其具体实现,被创建的实例的类型可以是接口,抽象类,也可以是具体的类。

2.简单案例(不灵活)

1.接口

  1. package com.yl.design;
  2. public interface Phone {
  3. void display();
  4. }

2.实现类1

  1. package com.yl.design;
  2. public class Huawei implements Phone {
  3. @Override
  4. public void display() {
  5. System.out.println("Huawei...");
  6. }
  7. }

3.实现类2

  1. package com.yl.design;
  2. public class Apple implements Phone {
  3. @Override
  4. public void display() {
  5. System.out.println("apple...");
  6. }
  7. }

4.工厂类

  1. package com.yl.design;
  2. public class SimpleFactory {
  3. //私有化构造器,不给外部new
  4. private SimpleFactory(){}
  5. //定义一个静态的方法,用于生产对象
  6. public static Phone CreatePhone(int flag) {
  7. Phone phone = null;
  8. if (flag == 1) {
  9. phone = new Apple();
  10. } else if (flag == 2) {
  11. phone = new Huawei();
  12. }
  13. return phone;
  14. }
  15. }

5.测试

  1. package com.yl.design;
  2. public class test {
  3. public static void main(String[] args) {
  4. Phone phone = SimpleFactory.CreatePhone(2);
  5. phone.display();
  6. }
  7. }

3.可配置的简单工厂案例(灵活)

1.在原来代码的基础上,加多一个factory.properties文件

2.工厂(利用反射构造实例)

  1. package com.yl.design;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.Properties;
  5. public class Factory {
  6. private Factory(){}
  7. public static Phone createPhone() {
  8. Properties properties = new Properties();
  9. InputStream in = null;
  10. try {
  11. in = Factory.class.getResourceAsStream("factory.properties");
  12. properties.load(in);
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. } finally {
  16. if (in != null) {
  17. try {
  18. in.close();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }
  24. //利用反射创建实例
  25. Phone phone = null;
  26. try {
  27. phone = (Phone)Class.forName(properties.getProperty("AppleClass")).newInstance();
  28. } catch (InstantiationException e) {
  29. e.printStackTrace();
  30. } catch (IllegalAccessException e) {
  31. e.printStackTrace();
  32. } catch (ClassNotFoundException e) {
  33. e.printStackTrace();
  34. }
  35. return phone;
  36. }
  37. }

3.测试

  1. package com.yl.design;
  2. public class test {
  3. public static void main(String[] args) {
  4. // Phone phone = SimpleFactory.CreatePhone(2);
  5. // phone.display();
  6. Phone phone = Factory.createPhone();
  7. phone.display();
  8. }
  9. }

相关文章