首页 > 其他分享 >工厂模式

工厂模式

时间:2024-03-26 21:12:06浏览次数:27  
标签:void 模式 public Phone call 工厂 class

 

1. 工厂模式介绍

  提供了一种将对象创建过程封装到一个单独的类中的方式,这个类就是被称为‘工厂类’,它根据特定的条件来决定应该创建哪个对象

 

2. 工厂模式的创建方式

  (1)简单工厂模式

public interface Phone {

    /**
     * 抽象电话功能
     */
    void call();
}
public class IPhone implements Phone {

    @Override
    public void call() {
        System.out.println("使用Iphone打电话");
    }
}
public class HuaweiPhone implements Phone {

    @Override
    public void call() {
        System.out.println("使用华为手机打电话");
    }
}
public class MiPhone implements Phone {

    @Override
    public void call() {
        System.out.println("使用MiPhone打电话");
    }
}
public class SimpleFactoryPattern {

    public static Phone create(String name){
        if (name.equals("IPhone")){
            return new IPhone();
        }else if (name.equals("MIPhone")){
            return new MiPhone();
        }else if (name.equals("Huawei")){
            return new HuaweiPhone();
        }
        return null;
    }
}
public class Main {
    public static void main(String[] args) {

        Phone iPhone = SimpleFactoryPattern.create("IPhone");
        iPhone.call();

        Phone miPhone = SimpleFactoryPattern.create("MIPhone");
        miPhone.call();
    }
}

  优点:

  (1)简单工厂模式的实现相对较为简单,易于理解和使用;

  (2)简单工厂模式可以将对象的创建与使用分离开来,降低了客户端代码和具体某类之间的耦合度;

  缺点:

  (1)一旦某类过多或者某产品变化频繁,就需要不断修改工厂类的代码,这样会导致工厂类变得过于庞大和复杂,可扩展性受到限制;

  (2)违反开闭原则:简单工厂模式的扩展性较差,如果需要添加新的某产品,就需要修改工厂类的代码,这样就会违反开闭原则;

 

  (2)工厂模式

public interface Phone {

    /**
     * 抽象电话功能
     */
    void call();
}
public class IPhone implements Phone {

    @Override
    public void call() {
        System.out.println("使用Iphone打电话");
    }
}
public class MiPhone implements Phone {

    @Override
    public void call() {
        System.out.println("使用MiPhone打电话");
    }
}
public interface PhoneFactory {

    /**
     * 抽象创建对象
     */
    Phone create();
}
public class IPhoneFactory implements PhoneFactory {
    @Override
    public Phone create() {
        return new IPhone();
    }
}
public class MiPhoneFactory implements PhoneFactory {

    @Override
    public Phone create() {
        return new MiPhone();
    }
}
public class Main {
    public static void main(String[] args) {
        MiPhoneFactory miPhoneFactory = new MiPhoneFactory();
        miPhoneFactory.create().call();

        IPhoneFactory iPhoneFactory = new IPhoneFactory();
        iPhoneFactory.create().call();
    }
}

  优点:

  不同于简单工厂模式,工厂方法模式和抽象工厂模式支持增加新的产品类型而不需要修改原有的代码,符合开闭原则,提高了系统的可扩展性

  缺点:

  工厂方法只能创建一种产品,一种产品只能对应一种工厂;因此,当产品过多的时候,也就增加了复杂度,创建过多的类;

 

  (3)超级工厂

public interface Phone {

    /**
     * 抽象电话功能
     */
    void call();
}
public class IPhone implements Phone {

    @Override
    public void call() {
        System.out.println("使用Iphone打电话");
    }
}
public class MiPhone implements Phone {

    @Override
    public void call() {
        System.out.println("使用MiPhone打电话");
    }
}
public class SuperFactorys {

    public static <T> T create(String className){
        try {
            //动态加载class
            Class<?> clazz = Class.forName(className);
            //通过class对象获取构造函数创建实例
            T instance = (T)clazz.getConstructor().newInstance();
            return instance;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("create instance fail",e);
        }
    }
}
public class Main {
    public static void main(String[] args) {
        Phone phone = SuperFactorys.create("com.lewang.factory.type03.MiPhone");
        phone.call();
    }
}

  超级工厂模式利用反射机制完美的解决了简单工厂模式存在的开闭原则的问题;结合了反射机制和泛型,也使得客户端代码更加的简洁,代码更具有灵动性、可维护性和扩展性!

  参考:https://blog.csdn.net/m0_67840539/article/details/130976213

标签:void,模式,public,Phone,call,工厂,class
From: https://www.cnblogs.com/homle/p/18097575

相关文章

  • Blazor学习记录六_模版化组件_渲染模式_CSS隔离和代码隔离
    17.模版化组件在组件中放置一个可渲染的代码片段供外部调用者来传入要渲染的内容及渲染样式,这样的组件就叫做模版化的组件。一般是一个支持泛型的组件,目标为消费者封装重复使用的通用性良好的UI组件。比如一个用来给用户呈现表格数据的表格组件。示例组件GenaricTable.razor代......
  • Redis发布订阅模式解决Guava Cache本地缓存刷新问题
    为什么要用本地缓存可以加快资源访问速度,减少第三方IO延迟,也避免了网络调用的开销,将数据存储在本地jvm内存中可以减少外部系统的压力,可以将频繁访问、且更新场景较少的数据缓存起来,降低对远程服务或者数据库的请求次数,降低外部系统负载,提供系统整体的稳定性缺点:但是同时也得......
  • Windows Packet Divert(WinDivert)是一个适用于Windows 10、Windows 11和Windows Server
    WindowsPacketDivert(WinDivert)是一个适用于Windows10、Windows11和WindowsServer的用户模式数据包捕获和重定向工具。WinDivert允许用户模式应用程序捕获/修改/丢弃发送到/从Windows网络堆栈的网络数据包。总之,WinDivert可以:捕获网络数据包过滤/丢弃网络数据包嗅探......
  • [AI][osg]关于osg的options的设计模式
    Options说明OSG(OpenSceneGraph)是一个高性能的开源3D图形工具包,用于可视化仿真、游戏、虚拟现实、科学可视化等领域。它提供了一套丰富的API和工具,帮助开发者创建复杂的3D场景和应用程序。在OSG中,Options机制用于控制场景图读取过程中的各种参数和行为。通过Options,开发者可以指......
  • 前端面试题:hash模式和history模式
    hash(哈希)和history(历史)是前端路由的两种模式,它们的主要区别在url,兼容性,服务器配置,美观性,和导航操作上面1,URLhash的url前面有#来表示路径,而history没有hash:hash模式是一种把前端路由的路径用#拼接在真实url后面的模式,通过hashchange事件监听hash值的改变来渲染页......
  • 代理模式(静态代理和动态代理)
    1.静态代理    静态代理中代理类与被代理类都需要实现同一个接口,这就说明我们的一个静态代理类只能代理一个类,并且还要事先知道我们要代理哪个类才能写代理类,如果我们有其他类还想使用代理那就必须再写一个代理类。【1】测试案例:法外狂徒张三叫律师打官司packageco......
  • Spring中用到的一些设计模式
    单例模式:bean默认就是单例原型模式:指定作用域为prototype工厂模式:BeanFactory模板方法:postProcessBeanFactory,onRefresh,initPropertyValue策略模式:xmlBeanDefinitionReader,PropertiesBeanDefinitionReader观察者模式:listener,event,multicast适配器模式:Adapter......
  • CentOS 7.9 快速搞定网络配置(NAT模式)
    本机网络配置:  2.虚拟机NAT模式配置  3.centos网卡配置vi/etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=staticDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=yesIPV6_DEF......
  • B2C平台是什么?B2C模式为企业营销提供了哪些功能?
    B2C平台,全称为Business-to-Consumer平台,也就是企业对个人的电子商务模式,是指企业直接向消费者销售产品和服务的电子商务平台。这种模式消除了中间商的存在,使得企业能够直接与消费者进行交易,降低了成本,提高了效率。在当前的企业营销运营中,B2C平台承担着多种重要的功能。首先,它......
  • RabbitMQ工厂虚拟机集群可靠性测试报告
    高可用集群架构节点域名操作系统RabbitMQ版本Erlang版本rabbitmq1.mfg.tp-link.comCentos7.93.8.2823.3-2rabbitmq2.mfg.tp-link.comCentos7.93.8.2823.3-2rabbitmq3.mfg.tp-link.comCentos7.93.8.2823.3-2目前Centos7.9通过直接RPM包部署安装的版......