工厂模式分为三种:简单工厂模式 (Simple Factory) 、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)

//举例:发送邮件和短信的例子

/**
* @author Administrator
* 产品类
*/
interface Sender{
  void send();
}
class MailSender implements Sender{
  @Override
  public void send() {
    System.out.println("this is a mailsender !");

  }
}
class SmsSender implements Sender{
  @Override
  public void send() {
    System.out.println("this is a smssender !");

}
}
/**
* @author Administrator
* 工厂类
*/
class SenderFactory{
  public Sender produce(String type){
    if("mail".equals(type)){
      return new MailSender();
    }else if("sms".equals(type)){
      return new SmsSender();
    }else{
      System.out.println("请输入正确的类型");
      return null;
    }
  }
}
/**
* @author Administrator
* 测试类
*/
public class SimpleFactoryTest{
  public static void main(String[] args) {
    SenderFactory factory = new SenderFactory();
    Sender sender = factory.produce("mail");
    sender.send();
  }
}

//结果:

this is a mailsender !

对于简单工厂模式而言,如果传递的字符串出错,则不能正确创建对象,或者说如果要发送彩信,需要去改进SenderFactory方法,显然违背了设计的原则
这里多个共产方法模式是提供了多个工厂方法,分别创建对象

/**
* @author Administrator
* 工厂类
*/
//class SenderFactory2{
// //发短信
//   public Sender smsProduce(){
//      return new SmsSender();
//   }
// //发邮件
//   public Sender mailProduce(){
//      return new MailSender();
//   }
//}
//也可以将工厂方法类改为静态的,这样就可以不同通过创建工厂的实例去调用
class SenderFactory2{
//发短信
  public static Sender smsProduce(){
    return new SmsSender();
  }
//发邮件
  public static Sender mailProduce(){
    return new MailSender();
  }
}

/**
* @author Administrator
* 测试类
*/
public class FactoryMethodTest {

  public static void main(String[] args) {
//     SenderFactory2 factory2= new SenderFactory2();
//      factory2.smsProduce().send();
//     factory2.mailProduce().send();

    //静态工厂方法模式
    SenderFactory2.smsProduce().send();
    SenderFactory2.mailProduce().send();
  }

}

/**
* @author Administrator
* 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是,如果想要扩展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题。
* 解决:用抽象工厂模式,创建多个工厂,这样一旦需要增加新功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
*
* 抽象工厂模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需要做一个实现类,实现Sender接口,同时做一个工厂类,实现Factory接口,就OK了,无需改现成的代码。这样做,扩展性好。
*/

//工厂类,多个工厂类
interface Factory{
  Sender produce();
}
class SmsFactory implements Factory{
  @Override
  public Sender produce() {
    return new SmsSender();
  }
}
class MailFactory implements Factory{
  @Override
  public Sender produce() {
    return new MailSender();
  }
}

/**
* @author Administrator
* 测试类
*/
public class AbstractFactoryTest {

  public static void main(String[] args) {
    Factory factory = new SmsFactory();
    Sender sender = factory.produce();
    sender.send();
  }

}

设计模式(二)工厂模式Factory (创建型)的更多相关文章

  1. Java设计模式02:常用设计模式之工厂模式(创建型模式)

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的.  工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...

  2. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  3. 设计模式二: 工厂方法(Factory Method)

    简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个 ...

  4. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  5. 设计模式~简单工厂模式(Factory)

    简单工厂模式Simple Factory根据提供给它的数据,返回一个类的实例.通常它返回的类都有一个公共的父类(或者接口对象). 简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类 ...

  6. 设计模式之工厂模式(Factory模式)

    在面向对象系统设计中经常遇到以下两类问题: 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明一个指向基类的 ...

  7. 【设计模式】工厂模式 Factory Pattern

    1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...

  8. JAVA设计模式之工厂模式—Factory Pattern

    1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...

  9. 设计模式之工厂模式 Factory实现

    simpleFactory //car接口 public interface Car { void run(); } //两个实现类 public class Audi implements Car{ ...

  10. java设计模式之 工厂模式Factory

    好比某种套路,经过不断实践,证明对项目结构非常有利 如果需要获取某种对象,如同获取不同的产品 需要由工厂来提供,工厂模式 可能的类或者对象:工厂类  产品:Cat  Dog  Fish ... //动 ...

随机推荐

  1. for update被锁定解锁

     查找被锁定的表,用户,session:SELECT object_name, machine, s.sid, s.serial#FROM gv$locked_object l, dba_object ...

  2. Linux特殊权限

    ************************     ACL权限       ****************************************** acl权限的出现是为了弥补用户权 ...

  3. C#设计模式-创建型模式(转)

    一.简单工厂模式 简单工厂模式Simple Factory,又称静态工厂方法模式.它是类的创建模式.是由一个工厂对象决定创建出哪一种产品类的实例,是不同的工厂方法模式的一个特殊实现. 优点: u 模式 ...

  4. java学习——IO流

    字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表.获取对应的文字.在对这个文字进行操作.简单说:字节流+编码表 ---------------------------- ...

  5. 探讨CMake中关于RPATH的使用

    最近研究CMake,发现CMake对于RPATH的管理也非常人性化.官方说法是当动态库的编译也和执行档在同级目录下的时候,CMake会自动给执行档加入适当的RPATH.具体可以通过readelf -d ...

  6. __PUBLIC__模板文件路径配置

    __PUBLIC__ 默认指向 项目文件下的Public文件夹 注意: __PUBLIC__不是一个常量,只在模板中进行替换,__ROOT__是一个常量 项目文件路径 defined('__PUBLI ...

  7. C语言内存对齐原理

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

  8. Django models通过DateTimeField保存到MySQL的时间的时区问题

    最近开始使用Django开发一些系统,在models.py中设置一些数据库表结构并给日期时间字段赋初值,不过在使用的过程中,遇到一点问题.问题是,我本来服务器使用的市区是“Asia/Shanghai” ...

  9. SQL SERVER 数据库邮件配置

    1.简单了解数据库邮件的概念和使用的传输协议及系统体系: 数据库邮件是从 SQL Server 数据库引擎中发送电子邮件的企业解决方案.通过使用数据库邮件,数据库应用程序可以向用户发送电子邮件.邮件中 ...

  10. Xcode can't verify the identity of the server

    当升级了苹果系统到 OS X El Captain 之后  ,打开Xcode 有时候会报错 如图 而且打开 svn  也会出类似错误  点击continue  了  下次 还会 出现 .这个很好解决 ...