设计模式-工厂模式的实现方式

本文详细介绍了工厂模式的概念及其三种实现方式:简单工厂、工厂方法及抽象工厂,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 工厂模式

   工厂模式是当需要new一个对象时通过工厂去创建一个对象。需要和创建的对象解耦时可以用工厂模式。

1.1 工厂模式的实现方式

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

2.1 简单工厂

   简单工厂的特点:工厂类是一个具体的类,通过工厂类的主要方法,如getInstance(),你用switch 或者if..else来创建所需要的对象。该实现方法不利于维护和扩展。比如需要怎么加一个DB2数据源,则需要添加具体产品子类并且需要修改工厂类,不好扩展。

//定义数据源接口
interface DataSource{
   public void getDataSource();
}
//定义mysql数据源实现类
class MysqlDataSource implements DataSource{

  @Override
  public void getDataSource() {
     System.out.println("我是mysql数据源");
  }
  
}
//定义sqlserver数据源实现类
class SqlServerDataSource implements DataSource{
  @Override
  public void getDataSource() {
     System.out.println("我是sqlServer数据源");
  }
}
//定义oracle数据源实现类
class OracleDataSource implements DataSource{
  @Override
  public void getDataSource() {
     System.out.println("我是oracle数据源");
  }
}

//定义获取数据源的工厂
class DataSourceFactory{
  public static final String TYPE_MYSQL="mysql";
  public static final String TYPE_SQLSERVER="sqlserver";
  public static final String TYPE_ORACLE="oracle";
  
  public static DataSource getInstance(String type){
     switch (type) {
     case TYPE_MYSQL:
        return new MysqlDataSource();
     case TYPE_SQLSERVER:
       return new SqlServerDataSource();
    default:
      return new OracleDataSource();
    }
  }
}
//测试
public class DataSourceTest {
  public static void main(String[] args) {
    DataSource instance = DataSourceFactory.getInstance(DataSourceFactory.TYPE_MYSQL);
    instance.getDataSource();//输出 “我是mysql数据源”
  }
}

(1)简单工厂模式的编写步骤

  • 创建产品接口,如 DataSource
  • 创建具体的产品子类,如MysqlDataSource,SqlServerDataSource,OracleDataSource
  • 创建工厂类,如 DataSourceFactory

2.2 工厂方法

  工厂方法是把简单工厂拆分为两层,一层是抽象工厂,一层是抽象工厂的子类。工厂方法利于软件的维护和二次开发。如果有新需求只需要添加对应的子类,而不是修改已有的类,比如增加一个DB2数据源,只需要添加一个DB2产品子类,和DB2的工厂子类就可以了。

//定义数据源接口
interface DataSource{
   public void getDataSource();
}
//定义mysql数据源实现类
class MysqlDataSource implements DataSource{

  @Override
  public void getDataSource() {
     System.out.println("我是mysql数据源");
  }
  
}
//定义sqlserver数据源实现类
class SqlServerDataSource implements DataSource{
  @Override
  public void getDataSource() {
     System.out.println("我是sqlServer数据源");
  }
}
//定义oracle数据源实现类
class OracleDataSource implements DataSource{
  @Override
  public void getDataSource() {
     System.out.println("我是oracle数据源");
  }
}
//定义工厂抽象类
abstract class DataSourceFactory{
  public abstract DataSource create();
}
//定义mysql数据源工厂类
class MysqlDataSourceFactory extends DataSourceFactory{
  @Override
  public DataSource create() {
    return new MysqlDataSource();
  }
}
//定义sqlserver数据源工厂类
class SqlServerDataSourceFactory extends DataSourceFactory{
  @Override
  public DataSource create() {
    return new SqlServerDataSource();
  }
}
//定义oracle数据源工厂类
class OracleDataSourceFactory extends DataSourceFactory{
  @Override
  public DataSource create() {
    return new OracleDataSource();
  }
}

//测试
public class DataSourceTest {
  public static void main(String[] args) {
    OracleDataSourceFactory dataSourceFactory=new OracleDataSourceFactory();
    DataSource create = dataSourceFactory.create();
    create.getDataSource();//输出 “我是oracle数据源”
  }
}

(1)工厂方法的创建步骤

  • 创建产品接口,如 DataSource
  • 创建具体的产品子类,如MysqlDataSource,SqlServerDataSource,OracleDataSource
  • 创建抽象工厂类,如DataSourceFactory,其中create() 为获取对象实例
  • 创建具体的工厂子类,如MysqlDataSourceFactory,SqlServerDataSourceFactory,OracleDataSourceFactory

2.3 抽象工厂

     抽象工厂针对的是多产品,每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

public class Test {
   public static void main(String[] args) {
     DnFactory dnFactory=new DnFactory();
     IPen createPen = dnFactory.createPen();
     createPen.desc(); //输出 “我是低档钢笔”
  }
}

//定义一个钢笔接口
interface IPen{
  public void desc();
}
//定义一个高档钢笔
class UpPen implements IPen{

  @Override
  public void desc() {
     System.out.println("我是高档钢笔");
  }
  
}
//定义一个低档钢笔
class DnPen implements IPen{
  @Override
  public void desc() {
     System.out.println("我是低档钢笔");
  }
}
//定义一个铅笔接口
interface IPencil{
  public void desc();
}
//定义一个高档铅笔
class UpPencil implements IPencil{

  @Override
  public void desc() {
     System.out.println("我是高档铅笔");
  }

}
//定义一个低档铅笔
class DnPencil implements IPencil{
  @Override
  public void desc() {
     System.out.println("我是低档铅笔");
  }
}

//定义抽象工厂
abstract class IFactory{
  abstract IPen createPen();
  abstract IPencil createPencil();
}
//定义高档工厂实现
class Upfactory extends IFactory{

  @Override
  IPen createPen() {
    return new UpPen();
  }

  @Override
  IPencil createPencil() {
    return new UpPencil();
  }
  
}
//定义低档工厂实现
class DnFactory extends IFactory{

  @Override
  IPen createPen() {
    return new DnPen();
  }

  @Override
  IPencil createPencil() {
    return new DnPencil();
  }
  
}

(1)抽象工厂的创建步骤

  • 创建产品接口,如 IPen,IPencil
  • 创建具体的产品子类,如UpPen,DnPen,UpPencil,DnPencil
  • 创建抽象工厂,如IFactory,用于穿件产品对象
  • 创建具体的工厂实现类,如Upfactory,DnFactory
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值