首页 > 其他分享 >设计模式—工厂模式

设计模式—工厂模式

时间:2023-07-25 12:33:17浏览次数:34  
标签:author admin 模式 工厂 IPhone 设计模式 public

目录

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

简单工厂模式

简单工厂模式的核心是定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离,降低系统的耦合度,使得两个修改起来相对容易些,当以后实现改变时,只需要修改工厂类即可。

类图

案例分析

  • 手机接口
/**
 * 手机接口
 *
 * @author admin
 */
public interface IPhone {
    void make();
}
  • 华为手机
/**
 * 华为手机
 *
 * @author admin
 */
public class HuaweiPhone implements IPhone {
    @Override
    public void make() {
        System.out.println("make huawei phone");
    }
}
  • 小米手机
/**
 * 小米手机
 *
 * @author admin
 */
public class XiaoMiPhone implements IPhone {
    @Override
    public void make() {
        System.out.println("make xiaomi phone");
    }
}
  • 手机工厂类
/**
 * 手机工厂
 *
 * @author admin
 */
public class PhoneFactory {
    public IPhone makePhone(String phoneType) {
        if ("xiaomi".equals(phoneType)) {
            return new XiaoMiPhone();
        } else if ("huawei".equals(phoneType)) {
            return new HuaweiPhone();
        } else {
            return null;
        }
    }
}
  • 客户端
/**
 * 客户端
 *
 * @author admin
 */
public class Client {
    public static void main(String[] args) {
        IPhone phone = new PhoneFactory().makePhone("huawei");
        phone.make();
    }
}

工厂方法模式

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

优点

  • 良好的封装性, 代码结构清晰。
  • 工厂方法模式的扩展性非常优秀 。
  • 屏蔽产品类。
  • 工厂方法模式是典型的解耦框架

类图

案例分析

  • 工厂接口
/**
 * 工厂接口
 *
 * @author admin
 */
public interface IPhoneFactory {
    IPhone makePhone();
}
  • 小米工厂
import org.kouhao.design.patterns.简单工厂模式.IPhone;
import org.kouhao.design.patterns.简单工厂模式.XiaoMiPhone;

/**
 * 小米工厂
 *
 * @author admin
 */
public class XiaomiFactory implements IPhoneFactory {
    @Override
    public IPhone makePhone() {
        return new XiaoMiPhone();
    }
}
  • 华为工厂
import org.kouhao.design.patterns.简单工厂模式.HuaweiPhone;
import org.kouhao.design.patterns.简单工厂模式.IPhone;

/**
 * 华为工厂
 *
 * @author admin
 */
public class HuaweiFactory implements IPhoneFactory {
    @Override
    public IPhone makePhone() {
        return new HuaweiPhone();
    }
}
  • 客户端
/**
 * 客户端
 *
 * @author admin
 */
public class Client {
    public static void main(String[] args) {
        IPhoneFactory huaweiFactory = new HuaweiFactory();
        huaweiFactory.makePhone();
        IPhoneFactory xiaomiFactory = new XiaomiFactory();
        xiaomiFactory.makePhone();
    }
}

抽象工厂模式

为创建一组相关或相互依赖的对象提供一个接口, 而且无须指定它们的具体类。

优点

  • 封装性
  • 产品族内的约束为非公开状态 。

缺点

抽象工厂模式的最大缺点就是产品族扩展非常困难 。

使用场景

一个对象族(或是一组没有任何关系的对象)都有相同的约束, 则可以使用抽象工厂模式。

注意事项

在抽象工厂模式的缺点中, 我们提到抽象工厂模式的产品族扩展比较困难, 但是一定要清楚, 是产品族扩展困难, 而不是产品等级。

类图

案例分析

  • 工厂接口
/**
 * 工厂接口
 *
 * @author admin
 */
public interface IFactory {
    IPhone makePhone();
    IPc makePc();
}
  • 小米工厂接口
import org.kouhao.design.patterns.简单工厂模式.IPhone;
import org.kouhao.design.patterns.简单工厂模式.XiaoMiPhone;

/**
 * 小米工厂
 *
 * @author admin
 */
public class XiaomiFactory implements IFactory {
    @Override
    public IPhone makePhone() {
        return new XiaoMiPhone();
    }

    @Override
    public IPc makePc() {
        return new XiaomiPc();
    }
}
  • 华为工厂接口
import org.kouhao.design.patterns.简单工厂模式.HuaweiPhone;
import org.kouhao.design.patterns.简单工厂模式.IPhone;

/**
 * 华为工厂
 *
 * @author admin
 */
public class HuaweiFactory implements IFactory {
    @Override
    public IPhone makePhone() {
        return new HuaweiPhone();
    }

    @Override
    public IPc makePc() {
        return new HuaweiPc();
    }
}
  • PC接口
/**
 * PC 接口
 *
 * @author admin
 */
public interface IPc {
    void make();
}
  • 华为PC
/**
 * 华为PC
 *
 * @author admin
 */
public class HuaweiPc implements IPc {
    public HuaweiPc() {
        this.make();
    }

    @Override
    public void make() {
        System.out.println("make huawei pc.");
    }
}
  • 小米PC
/**
 * 小米PC
 *
 * @author admin
 */
public class XiaomiPc implements IPc {
    public XiaomiPc(){
        this.make();
    }
    @Override
    public void make() {
        System.out.println("make xiaomi pc.");
    }
}
  • 客户端
/**
 * 客户端
 *
 * @author admin
 */
public class Client {
    public static void main(String[] args) {
        IFactory xiaomiFactory = new XiaomiFactory();
        IFactory huaweiFactory = new HuaweiFactory();
        xiaomiFactory.makePc();
        huaweiFactory.makePc();
        xiaomiFactory.makePhone();
        huaweiFactory.makePhone();
    }
}

标签:author,admin,模式,工厂,IPhone,设计模式,public
From: https://www.cnblogs.com/kouhao/p/17579586.html

相关文章

  • vs c#判断程序是否调试模式,开发模式,发布模式,Debug模式,Release模式
    转发自:https://blog.csdn.net/qq_37664403/article/details/1187471951.Debug模式,Release模式#ifDEBUGConsole.WriteLine(“Debug模式”);#elseConsole.WriteLine(“Release模式”);#endif此方法适合习惯好的程序员,但是对我来说不怎么习惯使用,因为调试个代码,和不在调试情况下运......
  • Java开发笔记之mac的intellij idea在debug模式下卡住的问题
    0x00问题描述mac的Intellijidea在debug模式下放行时,程序会卡住无响应;即使在已经放行的情况下,后续代码也不运行,console内只显示Theapplicationisrunning或者等了很久程序才开始后续的运行。 0x01解决方案修改host中的配置。通过以下命令,打开hosts的编辑页面。sudovi......
  • 非关语言: 设计模式
    http://www.riabook.cn/doc/designpattern/非关语言:设计模式程式设计是思维具体化的一种方式,是思考如何解决问题的过程,设计模式是在解决问题的过程中,一些良好思路的经验集成,最早讲设计模式,人们总会提到Gof 的著作,它最早将经典的23种模式集合在一起说明,对后期学习程式设计,尤......
  • IMU模式下DML语句所产生的REDO RECORD格式解读
    总结:IMU模式下DML语句所产生的REDORECORD格式,是先有操作的changerector,再有向向UNDO段头的事务表写事务信息的changerector,再提交操作的changerector后,才进行把数据修改前值放到UNDO的changerector。注意:实验中INSERT和DELETE是先后做的,UPDATE操作是......
  • 深入解析Oracle IMU模式下的REDO格式
    1.什么是IMU?IMU的主要作用是什么,也就是说为了解决什么问题?IMU--->InMemoryUndo,10g新特性,数据库会在sharedpool开辟独立的内存区域用于存储Undo信息,每个新事务都会分配一个IMUbuffer(私有的),一个buffer里有很多node,一个node相当于一个block(回滚块)。IMU特性:IMU顾名思义就是在内......
  • 非IMU模式下DML语句产生的REDO日志内容格式解读
    实验内容:非IMU模式下DML语句产生的REDO日志内容格式解读,数据库版本:11.2.0.4最详细的解读是UPDATE的。实验环境准备11G中默认是开启IMU特性的,做此实验需要关闭此特性。altersystemset"_in_memory_undo"=false;altersystemset"_in_memory_undo"=true......
  • OLAP系列之分析型数据库clickhouse主从副本模式(三)
    一、测试单分片,单副本或多副本模式#1.停止集群systemctlstopclickhouse-server#修改配置文件vim/etc/clickhouse-server/config.d/metrika.xml<remote_servers><clickhouse_cluster_3shards_1replicas><!--1个分片,1个副本--><sh......
  • JS函数调用的5种模式
    函数是经常会用的工具,这里总结一下关于在js中的5种函数调用的模式如下:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="v......
  • 一句话设计模式
    创建型模式(5种)单例模式publicstaticreadonlyUserAdministrator=newUser("admin");原型模型INewObjectnewObj=protoTpe.Clone();工厂模式IProductproduct=Factory.GetProduct("请输入产品名称");简单工厂模式(不算23种里面)工厂方法模式IFactoryfactory=newGuoCh......
  • 关于使用RocketMQ搭建多Master多Slave模式(同步)集群时遇到的问题
    搭建多Master多Slave模式(同步)集群时的java.lang.NullPointerException异常一、运行环境等基本描述(问题产生原因是权限问题,即权限不够导致无法启动broker,甚至broker线程无法通过jps命令查出。下面阐述分析思路)1.1)操作系统:Linux虚拟机:VMwareWorkstation16Pro、WSL ......