简单工厂模式

介绍

  1. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
  2. 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
  3. 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式.

案例

客户买车
image-20201018185958096.png

  1. //车的抽象类
  2. public abstract class Car {
  3. String name;
  4. public Car(String name) {
  5. this.name = name;
  6. }
  7. }
  8. //特斯拉汽车
  9. public class Tesla extends Car{
  10. public Tesla(String name) {
  11. super(name);
  12. }
  13. }
  14. //五菱汽车
  15. public class Wuling extends Car{
  16. public Wuling(String name) {
  17. super(name);
  18. }
  19. }
  1. //车工厂
  2. public class Factory {
  3. //方法1
  4. public static Car getCar(String name){
  5. if (name.equals("特斯拉")){
  6. return new Tesla(name);
  7. }else if (name.equals("五菱")){
  8. return new Wuling(name);
  9. }else {
  10. System.out.println("没有此车");
  11. return null;
  12. }
  13. }
  14. /*
  15. //方法2
  16. public static Car getTesla(){
  17. return new Tesla("特斯拉");
  18. }
  19. public static Car getWuling(){
  20. return new Tesla("五菱");
  21. }
  22. */
  23. }
  1. //cliet端使用工厂对象就可以得到车子实例对象
  2. public class Client {
  3. public static void main(String[] args) {
  4. Car car = Factory.getCar("特斯拉");
  5. System.out.println(car.name);
  6. Car car1 = Factory.getCar("五菱");
  7. System.out.println(car1.name);
  8. }
  9. }

个人总结
简单工厂的弊端是:如果需要扩展工厂输出的实例对象,则需要修改工厂类的逻辑代码,违反了开闭原则

工厂方法模式

介绍
定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类

案例
客户买车image-20201018192551844.png

  1. //车的抽象类
  2. public abstract class Car {
  3. String name;
  4. public Car(String name) {
  5. this.name = name;
  6. }
  7. }
  8. //特斯拉汽车
  9. public class Tesla extends Car{
  10. public Tesla(String name) {
  11. super(name);
  12. }
  13. }
  14. //五菱汽车
  15. public class Wuling extends Car{
  16. public Wuling(String name) {
  17. super(name);
  18. }
  19. }
  1. //工厂抽象类
  2. public interface Factory {
  3. public Car getCar();
  4. }
  5. //特斯拉工厂
  6. public class TeslaFactory implements Factory{
  7. @Override
  8. public Car getCar() {
  9. return new Tesla("特斯拉");
  10. }
  11. }
  12. //五菱工厂
  13. public class WulingFactory implements Factory{
  14. @Override
  15. public Car getCar() {
  16. return new Wuling("五菱宏光");
  17. }
  18. }
  1. //扩展一个大众车子类,并不需要改变原来的代码
  2. public class Dazhong extends Car{
  3. public Dazhong(String name) {
  4. super(name);
  5. }
  6. }
  7. public class DazhongFactory implements Factory{
  8. @Override
  9. public Car getCar() {
  10. return new Dazhong("大众");
  11. }
  12. }
  1. //Client根据需要买的车创建对应的车工厂得到车
  2. public class Client {
  3. public static void main(String[] args) {
  4. Car car1 = new TeslaFactory().getCar();
  5. System.out.println(car1.name);
  6. Car car2 = new WulingFactory().getCar();
  7. System.out.println(car2.name);
  8. Car car3 = new DazhongFactory().getCar();
  9. System.out.println(car3.name);
  10. }
  11. }

个人总结
工厂方法模式虽然符合开闭原则,但是编程难度和类的数量会增加,谨慎使用

抽象工厂模式

介绍

  1. 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
  2. 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
  3. 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
  4. 将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇, 更利于代码的维护和扩展。

原理image-20201018200934195.png
对原理类图的说明-即(职责链模式的角色及职责)
1)productA和productB是某产品的抽象类
2)productA1,productA2,productB1,productB2产品的具体实现类
3)Creator超级工厂(抽象),定义需要生产的抽象产品方法
4)ConcreteCreator1和ConcreteCreator2是具体的工厂

案例
需要生产华为的手机和路由器和小米的手机和路由器

  1. //抽象手机类
  2. public interface Phone {
  3. void open();
  4. void call();
  5. void sendMessage();
  6. void close();
  7. }
  8. //小米手机
  9. public class XiaomiPhone implements Phone{
  10. @Override
  11. public void open() {
  12. System.out.println("小米手机开机");
  13. }
  14. @Override
  15. public void call() {
  16. System.out.println("小米手机打电话");
  17. }
  18. @Override
  19. public void sendMessage() {
  20. System.out.println("小米手机发信息");
  21. }
  22. @Override
  23. public void close() {
  24. System.out.println("小米手机关机");
  25. }
  26. }
  27. //华为手机
  28. public class HuaweiPhone implements Phone{
  29. @Override
  30. public void open() {
  31. System.out.println("华为手机开机");
  32. }
  33. @Override
  34. public void call() {
  35. System.out.println("华为手机打电话");
  36. }
  37. @Override
  38. public void sendMessage() {
  39. System.out.println("华为手机发信息");
  40. }
  41. @Override
  42. public void close() {
  43. System.out.println("华为手机关机");
  44. }
  45. }
  1. //抽象路由类
  2. public interface Route {
  3. void open();
  4. void set();
  5. void close();
  6. }
  7. //小米路由
  8. public class XiaomiRoute implements Route{
  9. @Override
  10. public void open() {
  11. System.out.println("小米路由器开启");
  12. }
  13. @Override
  14. public void set() {
  15. System.out.println("小米路由器设置");
  16. }
  17. @Override
  18. public void close() {
  19. System.out.println("小米路由器关闭");
  20. }
  21. }
  22. //华为路由
  23. public class HuaweiRoute implements Route{
  24. @Override
  25. public void open() {
  26. System.out.println("华为路由器开启");
  27. }
  28. @Override
  29. public void set() {
  30. System.out.println("华为路由器设置");
  31. }
  32. @Override
  33. public void close() {
  34. System.out.println("华为路由器关闭");
  35. }
  36. }
  1. //抽象超级工厂(创建工厂的工厂)
  2. public interface SuperFactory {
  3. public Phone productPhone();
  4. public Route productRoute();
  5. }
  6. //小米工厂
  7. public class XiaomiFactory implements SuperFactory{
  8. @Override
  9. public Phone productPhone() {
  10. return new XiaomiPhone();
  11. }
  12. @Override
  13. public Route productRoute() {
  14. return new XiaomiRoute();
  15. }
  16. }
  17. //华为工厂
  18. public class HuaweiFactory implements SuperFactory{
  19. @Override
  20. public Phone productPhone() {
  21. return new HuaweiPhone();
  22. }
  23. @Override
  24. public Route productRoute() {
  25. return new HuaweiRoute();
  26. }
  27. }
  1. //Client端调用(需要哪一个品牌的产品,先把工厂new出来)
  2. public class Client {
  3. public static void main(String[] args) {
  4. System.out.println("================小米系列===================");
  5. XiaomiFactory xiaomiFactory = new XiaomiFactory();
  6. Phone phone1 = xiaomiFactory.productPhone();
  7. phone1.open();
  8. phone1.sendMessage();
  9. Route route1 = xiaomiFactory.productRoute();
  10. route1.open();
  11. route1.set();
  12. System.out.println("================华为系列===================");
  13. HuaweiFactory huaweiFactory = new HuaweiFactory();
  14. Phone phone2 = huaweiFactory.productPhone();
  15. phone2.open();
  16. phone2.sendMessage();
  17. Route route2 = huaweiFactory.productRoute();
  18. route2.open();
  19. route2.set();
  20. }
  21. }

image-20201018211128224.png

工厂模式小结

  1. 工厂模式的意义将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
  2. 三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)
  3. 设计模式的依赖抽象原则

1)创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返2)回。有的书上说,变量不要直接持有具体类的引用。
2)不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
3)不要覆盖基类中已经实现的方法。