• 简单工厂,工厂方法,抽象工厂模式


    简单工厂,工厂方法,抽象工厂模式

    软件设计七大原则

    开闭原则对扩展开放,对修改关闭降低维护带来的新风险
    依赖倒置原则高层不应该依赖低层,要面向接口编程更利于代码结构的升级扩展
    单一职责原则一个类只干一件事,实现类要单一便于理解,提高代码的可读性
    接口隔离原则一个接口只干一件事,接口要精简单一功能解耦,高聚合、低耦合
    迪米特法则不该知道的不要知道,一个类应该保持对其它对象最少的了解,降低耦合度只和朋友交流,不和陌生人说话,减少代码臃肿
    里氏替换原则不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义防止继承泛滥
    合成复用原则尽量使用组合或者聚合关系实现代码复用,少使用继承降低代码耦合

    简单工厂模式:

    1.定义:简单来说就是在实例化对象的时候不在使用new Object()这个形式,而是3可以根据用户的选择条件来 实例化相对应需要的类。对于客户端来说,去除了具体类的相关依赖。只需要给出具体的实例给工厂,工厂就会自动返回具体的实例对象。

     

    在创建车型的时候我们一共有三种选择的车型:Hongqi,Biyadi,Benz,各自可以生产:红旗,比亚迪,奔驰。我们创建有个工厂类来根据用户输入的车型,创建其相对应的类:

    汽车类

    1. public interface Car {
    2. void createCar();
    3. }

    具体车型实现Car接口

    1. public class HongqiCar implements Car {
    2. @Override
    3. public void createCar() {
    4. System.out.println("生产红旗");
    5. }
    6. }
    7. public class BenzCar implements Car{
    8. @Override
    9. public void createCar() {
    10. System.out.println("生产奔驰");
    11. }
    12. }
    13. public class BiyadiCar implements Car{
    14. @Override
    15. public void createCar() {
    16. System.out.println("生产比亚迪");
    17. }
    18. }
     
    

    创建工厂类:

    1. public class CarFactor {
    2. public Car createModel(String model){
    3. Car car=null;
    4. switch (model){
    5. case "比亚迪":
    6. car=new BiyadiCar();
    7. case "红旗":
    8. car=new HongqiCar();
    9. case "奔驰":
    10. car=new BenzCar();
    11. }
    12. return car;
    13. }
    14. }

    测试:

    1. public class test {
    2. public static void main(String[] args) {
    3. CarFactor carFactor = new CarFactor();
    4. Car car = carFactor.createModel("比亚迪");
    5. car.createCar();
    6. }
    7. }
    ​
    输出:生产比亚迪

    总结:简单工厂符合单一原则,用牺牲开闭的 方式来提高灵活性。

    工厂方法模式(Factory Method):

    1.定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。

     

    1. //创建工厂接口CarFactory:
    2. public interface CarFactory {
    3. Car createCarFactory();
    4. }
    5. //创建具体类型的工厂:
    6. public class BenzFactory implements CarFactory {
    7. @Override
    8. public Car createCarFactory() {
    9. return new BiyadiCar();
    10. }
    11. }
    12. public class BiyadiFactory implements CarFactory{
    13. @Override
    14. public Car createCarFactory() {
    15. return new BiyadiCar();
    16. }
    17. }
    18. public class HongqiFactory implements CarFactory{
    19. @Override
    20. public Car createCarFactory() {
    21. return new HongqiCar();
    22. }
    23. }
    24. //测试
    25. public static void main(String[] args) {
    26. HongqiFactory hongqiFactory = new HongqiFactory();
    27. Car carFactory = hongqiFactory.createCarFactory();
    28. carFactory.createCar();
    29. }
    30. }
    31. //输出:生产比亚迪

    总结:用户只需要知道具体工厂的名字,就可以得到想要的产品。

    其满足单一原则,开闭原则,但是灵活性较差。

    抽象工厂模式(Abstract Factory):

    1.定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们

    1. //创建电车,油车,混能车的抽象接口
    2. public interface ECar {
    3. void createCar();
    4. }
    5. public interface HCar {
    6. void createCar();
    7. }
    8. public interface OCar {
    9. void createCar();
    10. }
    11. //创建具体品牌车型的具体类(其他车型以此类推)
    12. public class BenZECar implements ECar{
    13. @Override
    14. public void createCar() {
    15. System.out.println("奔驰电车");
    16. }
    17. }
    18. public class BenZHCar implements HCar{
    19. @Override
    20. public void createCar() {
    21. System.out.println("奔驰混合车");
    22. }
    23. }
    24. public class BenZOCar implements OCar {
    25. @Override
    26. public void createCar() {
    27. System.out.println("奔驰油车");
    28. }
    29. }
    30. //创建抽象车型工厂接口
    31. public interface CarFactory {
    32. ECar createEcar();
    33. OCar createOcar();
    34. HCar createHcar();
    35. }
    36. //创建具体品牌的工厂实现接口工厂CarFactory(其他品牌以此类推)
    37. public class BenZFactory implements CarFactory {
    38. @Override
    39. public ECar createEcar() {
    40. return new BenZECar();
    41. }
    42. @Override
    43. public OCar createOcar() {
    44. return new BenZOCar();
    45. }
    46. @Override
    47. public HCar createHcar() {
    48. return new BenZHCar();
    49. }
    50. }
    51. //测试
    52. public class test {
    53. public static void main(String[] args) {
    54. BenZFactory benZFactory = new BenZFactory();
    55. HCar hcar = benZFactory.createHcar();
    56. hcar.createCar();
    57. }
    58. }

    总结:抽象方法符合单一原则,开闭原则,但是灵活性差

    抽象工厂--简单抽象工厂

    将工厂类替换为:

    1. public class SimpleAbstractCatFactory {
    2. public ECar createECars(String brand ){
    3. Ecar ecar = null;
    4. switch (brand) {
    5. case "比亚迪":
    6. ecar = new BIyadiEcar();
    7. break;
    8. case "红旗":
    9. ecar = new HongqiEcar();
    10. break;
    11. case "奔驰":
    12. ecar = new BenZEcar();
    13. break;
    14. }
    15. return ecar;
    16. }
    17. ​}

    总结:抽象方法符合单一原则,不符合开闭原则,但是灵活性高

    工厂模式小结

    工厂方法模式与抽象工厂模式的区别在于:

    (1)工厂方法只有一个抽象产品类和一个抽象工厂类,但可以派生出多个具体产品类和具体工厂类,每个具体工厂类只能创建一个具体产品类的实例。

    (2)抽象工厂模式拥有多个抽象产品类(产品族)和一个抽象工厂类,每个抽象产品类可以派生出多个具体产品类;抽象工厂类也可以派生出多个具体工厂类,同时每个具体工厂类可以创建多个具体产品类的实例

  • 相关阅读:
    【论文阅读】EssayGAN:基于生成对抗网络的数据增强用于自动作文评分
    【服务器搭建】教程三:怎样购买域名并怎样进行域名解析 来啦
    mariadb主主
    MySQL 数据类型和搜索引擎
    python的opencv最最基础初学
    基于高德地图实现Android定位功能实现(二)
    纯干货解答 | ERP是什么?有什么作用呢?
    【二】2D测量 Metrology——get_metrology_object_result_contour()算子
    简析 Linux 的 CPU 时间
    Azure CDN
  • 原文地址:https://blog.csdn.net/qq_46084827/article/details/127870367