• 工厂模式代码实例详解


    前面文章我们说过:

    创建型模式--设计模式详解?icon-default.png?t=M85Bhttps://blog.csdn.net/ke1ying/article/details/127183962

    项目背景:公司需求目前需要对接抖音 和 菜鸟,一期需求只做抖音菜鸟,后面会对接更多的,比如拼多多,得物等。

    条条大路通罗马,代码都能实现,但如何更合理的实现,遵循设计模式,才是一个优秀的程序员该考虑的问题。作为一个 精益求精的程序员,工作几年之后,不应该只满足于单纯的实现需求,还应该追求代码的质量。

    为了防止大家忘记前面文章写的设计模式,于是大家再复习一遍。

    简单工厂模式,通过传递的参数来确定返回的对象是什么:

    1. public class SimpleChickenFactory {
    2. /**
    3. * 通过传递的参数
    4. */
    5. public Chicken getChicken(String name){
    6. Chicken chicken = null;
    7. if(name.equals("CN")){
    8. chicken = new CNChicken();
    9. }else if(name.equals("USA")){
    10. chicken = new USAChicken();
    11. }
    12. return chicken;
    13. }
    14. }
    15. public class CNChicken extends Chicken{
    16. }

    这样写就不遵循开闭原则,每次新增一个的时候,都需要修改之前的代码,所以从设计的角度讲,肯定是有问题的,如何解决这个问题?

    我们可以写一个创建对象类,然后用不同的工厂来实现这个抽象类,这样如果新增则直接新增工厂类。

    1. public class USAChicken extends AllChicken{
    2. @Override
    3. public Chicken create(String name) {
    4. Chicken chicken = null;
    5. if(name.equals("KFC")){
    6. chicken = new KFCChicken();
    7. }else if(name.equals("MC")){
    8. chicken = new MCChicken();
    9. }
    10. return chicken;
    11. }
    12. }
    13. public class BJChicken extends AllChicken{
    14. @Override
    15. public Chicken create(String name) {
    16. Chicken chicken = null;
    17. if(name.equals("KFC")){
    18. chicken = new KFCChicken();
    19. }else if(name.equals("MC")){
    20. chicken = new MCChicken();
    21. }
    22. return chicken;
    23. }
    24. }

    当我们通过抽象类实现的时候,扩展性就更好了,但还是有缺陷,如果我们继续优化的话。

    1. public class FactoryChicken extends AllChicken{
    2. public FactoryChicken(String address) {
    3. super(address);
    4. }
    5. @Override
    6. public Chicken create(String name) {
    7. Chicken chicken = null;
    8. if(name.equals("KFC")){
    9. chicken = new KFCChicken();
    10. }else if(name.equals("MC")){
    11. chicken = new MCChicken();
    12. }
    13. return chicken;
    14. }
    15. }
    16. public abstract class AllChicken implements ChickenInterface{
    17. private String address;
    18. public AllChicken(String address){
    19. this.address = address;
    20. }
    21. }
    22. public interface ChickenInterface {
    23. public Chicken create(String name);
    24. }

    这样扩展性就更好了,通过地址只需要入参就可以通过不同的地址实例化。

    当以上实现之后,我们把项目需求代入抽象工厂模式,我们需要根据不同的商家来写不同的代码,遵循开闭原则,每个商家都有订购或者取消等功能,于是设计如下。

    1. public class DYOrderFactory extends OrderFactory{
    2. public DYOrderFactory(String channel) {
    3. super(channel);
    4. }
    5. @Override
    6. public void order() {
    7. System.out.println("下单");
    8. }
    9. @Override
    10. public void cancel() {
    11. }
    12. }
    13. public abstract class OrderFactory implements OrderInterface{
    14. private String channel;
    15. public OrderFactory(String channel){
    16. this.channel = channel;
    17. }
    18. public String getChannel() {
    19. return channel;
    20. }
    21. }
    22. public interface OrderInterface {
    23. public void order();
    24. public void cancel();
    25. }

  • 相关阅读:
    【深入浅出 Yarn 架构与实现】3-3 Yarn Application Master 编写
    单核与多核CPU的区别与联系-结合ESP32浅谈
    C++实现线程池
    大数据分析实践 | 过滤和抽样
    PLL的环路滤波器
    生成多元正态数据
    基于Echarts实现可视化数据大屏3D元素周期表(1页)
    基于el-tooltip组件封装超出显示省略号,鼠标hover显示tooltip的组件
    linux--用户、组、权限
    MotoGP Ignition:聚焦活动 #3 来啦!
  • 原文地址:https://blog.csdn.net/ke1ying/article/details/127739388