设计模式(三十一)------23种设计模式(23):简单工厂模式
来源:互联网 发布:em算法,知乎 编辑:程序博客网 时间:2024/05/20 20:58
使用频率:★★★★☆
一、什么是简单工厂模式
一个工厂方法,依据传入的参数,生成对应的具体产品对象;
二、补充说明
不属于23种GOF设计模式;
工厂方法一般设成静态方法,返回值一般是抽象类或接口,具体的产品类一般继承或实现抽象类、接口;
优点:产品使用者不需要关心产品类的创建过程,与具体产品的实现类达到解耦的效果;
缺点:违背"开放--封闭"原则(OCP),因为新增一个产品类的时候,需要修改原先的工厂方法;
适用场合:当工厂类负责创建的对象比较少的时候;
三、角色
- 抽象产品
- 具体产品
- 具体工厂
- 产品使用者
具体产品继承抽象产品;
单个具体工厂负责生产不同的具体产品;
产品使用者使用单个具体工厂生产的不同的具体产品;
四、例子
类关系图:
代码:
【抽象产品类】首先,定义一个抽象父亲类,拥有一个name属性和打印name的方法,其次还有若干doSomething方法:
package com.pichen.dp.creationalpattern.simplefactory;public abstract class Father { private String name; /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } public abstract void printName(); public abstract void doSomething01(); public abstract void doSomething02(); public abstract void doSomething03();}
【具体产品类】定义具体的中国父亲类和美国父亲类,继承抽象父亲类,并实现printName等方法:
package com.pichen.dp.creationalpattern.simplefactory;public class ChineseFather extends Father{ public ChineseFather(String name) { this.setName(name); } @Override public void printName() { System.out.println(this.getClass().getName() + ":" + this.getName()); } @Override public void doSomething01() { // TODO Auto-generated method stub } @Override public void doSomething02() { // TODO Auto-generated method stub } @Override public void doSomething03() { // TODO Auto-generated method stub }}
package com.pichen.dp.creationalpattern.simplefactory;public class AmericanFather extends Father{ public AmericanFather(String name) { this.setName(name); } @Override public void printName() { System.out.println(this.getClass().getName() + ":" + this.getName()); } @Override public void doSomething01() { // TODO Auto-generated method stub } @Override public void doSomething02() { // TODO Auto-generated method stub } @Override public void doSomething03() { // TODO Auto-generated method stub }}
【简单工厂类】定义一个简单共产类,并定义一个静态生产方法,根据传进来的type参数生成对应的具体父亲类:
package com.pichen.dp.creationalpattern.simplefactory;import com.pichen.dp.common.exception.DPException;public class SimpleFactory { public static Father produce(String type, String name) throws DPException{ if("cn".equals(type)){ return new ChineseFather(name); }else if("us".equals(type)){ return new AmericanFather(name); }else{ throw new DPException("invalid param~"); } }}
【产品使用类】开始测试使用产品,首选写个makeMoney方法:由工厂类生产一个父亲类,并开始赚钱,最后返回由工厂生产的具体父亲类实例;
main方法:调用makeMoney方法,并打印具体父亲类的name;
具体看代码:
package com.pichen.dp.creationalpattern.simplefactory;import com.pichen.dp.common.exception.DPException;public class Main { public static Father makeMoney(String type, String name) { Father father = null; /* 调用共产方法,创建具体产品类 */ try { father = SimpleFactory.produce(type, name); } catch (DPException e) { System.out.println("exception happend when produce " + type + " obj~"); e.printStackTrace(); } /* 具体赚钱的步骤 */ if(father != null){ father.doSomething01(); father.doSomething02(); father.doSomething03(); } return father; } public static void main(String[] args) { Father cnFather = Main.makeMoney("cn", "cn father"); if (cnFather != null) cnFather.printName(); Father usFather = Main.makeMoney("us", "us father "); if (usFather != null) usFather.printName(); Father apple = Main.makeMoney("fruit","apple"); if (apple != null) apple.printName(); }}
【其它】异常类DPException:
package com.pichen.dp.common.exception;public class DPException extends Exception{ /** * */ private static final long serialVersionUID = 8110345414312602844L; public DPException(String msg){ super(msg); System.out.println("DPException~"); }}
@Author 风一样的码农
@HomePageUrl http://www.cnblogs.com/chenpi/
@Copyright 转载请注明出处,谢谢~
阅读全文
0 0
- 设计模式(三十一)------23种设计模式(23):简单工厂模式
- 23种设计模式(2):简单工厂模式
- 23种设计模式--简单工厂模式
- 【23种设计模式】创建型模式 > 三个工厂模式(简单工厂、抽象工厂、工厂方法)
- 设计模式(简单工厂)
- 设计模式(2)-简单工厂模式
- 设计模式 - 简单工厂模式(C++)
- 设计模式(一):简单工厂模式
- 设计模式(简单工厂模式)
- 设计模式(一)简单工厂模式
- c++设计模式(简单工厂模式)
- 设计模式(2)简单工厂模式
- 设计模式(一)简单工厂模式
- 设计模式(四)简单工厂模式
- 简单工厂模式(设计模式02)
- 设计模式(六简单工厂模式)
- 设计模式-简单工厂模式(SimpleFactory)
- 设计模式(一)简单工厂模式
- 过孔残庄
- 转date方法
- 数组
- 从投票应用说起,功能才不是轻社交App的核心呢!
- 使用UDP协议编写一个网络程序,设置接收端程序的监听端口是8001,发送端发送的数据是“Hello, world”。
- 设计模式(三十一)------23种设计模式(23):简单工厂模式
- 关于RISC-V成为印度国家指令集的一些看法
- 如何设置,使IntelliJ IDEA智能提示忽略大小写
- C++连接CTP接口实现简单量化交易
- 同步以太网与时钟协议
- 再谈扁平化
- SpringMVC中的配置文件applicationContext.xml和dispatcher-servlet.xml
- 原创视频|手把手教你用Axure做一个微信高保真原型(一)
- 第一阶段-入门详细图文讲解tensorflow1.4 -(三)TensorFlow 编程基础知识