美文网首页
工厂模式实战

工厂模式实战

作者: 奋斗的韭菜汪 | 来源:发表于2020-06-23 21:04 被阅读0次

设计模式最重要的是解耦,(面向抽象编程,面向接口编程)
简单工厂是产品的工厂,工厂方法是工厂的工厂,抽象工厂是复杂产品的工厂
简单工厂模式:1、工厂生产一类具有共同特征的产品,2、工厂制定标准 3、通过标识告诉工厂生产什么产品
适合创建对象种类较少的场景(Calender),缺点:不易于扩展复杂的产品结构,新增产品需要修改工厂代码,违背了开闭原则

工厂方法模式:起的是一个调度的作用,用户只需要关心产品对应的工厂(比简单工厂模式多一层工厂(指定产品的工厂)),不需要关心产品的细节,加入新的产品工厂的实现逻辑不需要改变,符合开闭原则
主要是解决产品扩展的问题
使用场景:创建对象需要大量的重复代码
缺点:类的数量容易过多,增加了代码的复杂性

抽象工厂:是指提供一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类
(抽象工厂不符合开闭原则,适用于产品族相对比较稳定的场景)
缺点:规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口,增加了系统的抽象性和理解难度。
优点:1、完成遵循单一原则,具体产品在应用层代码隔离,无须关心创建细节,2、将一个系列的产品族统一到一起创建
简单工厂模式:

public interface ICourse {
    void record();
}
public class JavaCourse implements ICourse {
    @Override
    public void record() {
        System.out.println("java 课程");
    }
}
public class PythonCourse implements ICourse {
    @Override
    public void record() {
        System.out.println("python 课程");
    }
}
public class CourseFactory {

    public ICourse create(Class<? extends ICourse> clazz) throws Exception {

//        if (name.equals("java")){
//            return new JavaCourse();
//        } else if(name.equals("pythone")){
//            return new PythonCourse();
//        } else {
//             throw new Exception("没有这个课程");
//        }

        //(代码优化)课程名有可能传错(例如:Java),使用反射
//        if(!StringUtils.isEmpty(className)){
//            return (ICourse)Class.forName(className).newInstance();
//        }
//
//        return null;

        //(继续优化),全类名笔记复杂,输入没有限制,直接传入类Class
        if (clazz != null){
            //(继续优化)这里需要强转,可以继续优化,强制要求传进来的clazz是ICourse的子类,使用泛型
            //return (ICourse) clazz.newInstance();
            return clazz.newInstance();
        }
        return null;
    }
}
public class SimpleFactoryTest {

    public static void main(String[] args) {
        ICourse iCourse = null;
        try {
            //iCourse = new CourseFactory().create("com.example.designpattern.simpleFactory.PythonCourse");
            iCourse = new CourseFactory().create(JavaCourse.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        iCourse.record();
    }
}

抽象工厂模式:

public interface ICourse {
    void record();
}
public interface INote {
    void edit();
}
public interface IVideo {
    void record();
}
/**
 * 每一个产品创建前创建后没有公共的逻辑可以使用接口,有公共逻辑的话使用抽象类
 */
public abstract class CourseFactory {

    public void init(){
        System.out.println("初始化基础数据");
    }

    protected abstract  INote createNote();

    protected abstract  IVideo createVideo();

}
public class JavaCourseFactory extends CourseFactory {
    @Override
    protected INote createNote() {
        super.init();
        return new JavaNote();
    }

    @Override
    protected IVideo createVideo() {
        super.init();
        return new JavaVideo();
    }
}

public class PythonCourseFactory extends CourseFactory {
    @Override
    protected INote createNote() {
        super.init();
        return new PythonNote();
    }

    @Override
    protected IVideo createVideo() {
        super.init();
        return new PythonVideo();
    }
}
public class JavaCourse implements ICourse {
    @Override
    public void record() {
        System.out.println("java 课程");
    }
}
public class PythonCourse implements ICourse {
    @Override
    public void record() {
        System.out.println("python 课程");
    }
}
public class JavaNote implements INote {
    @Override
    public void edit() {
        System.out.println("修改java笔记");
    }
}
public class JavaVideo implements IVideo {
    @Override
    public void record() {
        System.out.println("记录java课程");
    }
}
public class PythonNote implements INote {
    @Override
    public void edit() {
        System.out.println("修改python笔记");
    }
}
public class PythonVideo implements IVideo {
    @Override
    public void record() {
        System.out.println("记录python课程");
    }
}
public class AbstractFactoryTest {
    public static void main(String[] args) {
        CourseFactory factory = new JavaCourseFactory();
        factory.createNote().edit();
        factory.createVideo().record();
    }
}

相关文章

  • PHP完整实战23种设计模式

    前言 设计模式是面向对象的最佳实践 实战 PHP实战创建型模式 单例模式 工厂模式 抽象工厂模式 原型模式 建造者...

  • PHP 完整实战23种设计模式

    PHP实战创建型模式 单例模式 工厂模式 抽象工厂模式 原型模式 建造者模式 PHP实战结构型模式 桥接模式 享元...

  • PHP完整实战23种设计模式

    前言设计模式是面向对象的最佳实践实战PHP实战创建型模式创建型 Factory Method(工厂方法)-工厂模式...

  • 工厂模式实战

    设计模式最重要的是解耦,(面向抽象编程,面向接口编程)简单工厂是产品的工厂,工厂方法是工厂的工厂,抽象工厂是复杂产...

  • Java 23种设计模式系列之——实战桥接模式

    设计模式的分类--实战桥接模式 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例...

  • 设计模式之策略模式

    设计模式(策略模式实战) 一.分类 java的设计模式大体上分为三大类: 创建型模式(5种): 工厂方法模式,抽象...

  • 工厂模式 + 单例模式实战

    一、绪论 1、Tips 这篇文章是基于上篇文章 《工厂模式为 MVC 解耦》之上的后续,建议先看上篇文章。 2、提...

  • 设计模式项目实战工厂模式和抽象工厂模式

    工厂模式(经常使用) 工厂模式是常见的设计模式之一,这种模式的设计模式属于创建型模式,它提供了一种创建对象的方式。...

  • 设计模式

    设计模式实战 工厂模式 使用静态工厂方法替代构造器讲构造器私有化 优点 名字可以不一样【自定义,语义化】 不像构造...

  • 常用设计模式

    设计模式 工厂模式 工厂模式思路上分:简单工厂模式,工厂模式, 抽象工厂模式// 抽象工厂模式可以代替工厂模式,做...

网友评论

      本文标题:工厂模式实战

      本文链接:https://www.haomeiwen.com/subject/gfrkfktx.html