Java的23种设计模式(2)工厂模式

工厂模式

实现对象创建者和调用者分离. 实例化对象不使用new,用工厂的方法替代.

简单(静态)工厂模式

所有产品使用同一个工厂类.

创建工厂类,工厂使用不同静态方法或同一个静态方法传入不同参数去 new 不同的产品对象.消费者只需调用工厂的静态方法即可得到需要的对象.

//产品接口
public interface Shape {
   void draw();
}

//产品类
public class Rectangle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("创建的是Rectangle");
   }
}

public class Square implements Shape {
 
   @Override
   public void draw() {
      System.out.println("创建的是Square");
   }
}

//工厂类
public class ShapeFactory {
    
   //使用 getShape 方法获取形状类型的对象
   public static Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }        
      if(shapeType.equals("CIRCLE")){
         return new Circle();
      } else if(shapeType.equals("RECTANGLE")){
         return new Rectangle();
      }
   }
}

//消费者
public class FactoryPatternDemo {
 
   public static void main(String[] args) {

      //获取 Circle 的对象,并调用它的 draw 方法
      Shape shape1 = ShapeFactory.getShape("CIRCLE");
      //调用 Circle 的 draw 方法
      shape1.draw();
 
      //获取 Rectangle 的对象,并调用它的 draw 方法
      Shape shape2 = ShapeFactory.getShape("RECTANGLE");
      //调用 Rectangle 的 draw 方法
      shape2.draw();
   }
}

如果工厂想添加新的产品必须修改已有代码,不满足开闭原则

工厂方法模式

一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类只能创建一个具体产品类的实例。

消费者找到产品对应的工厂即可获取产品对象.

//产品接口
public interface Reader {
    void read();
}

//产品类
public class JpgReader implements Reader {
    @Override
    public void read() {
        System.out.print("read jpg");
    }
}

public class PngReader implements Reader {
    @Override
    public void read() {
        System.out.print("read png");
    }
}

//工厂接口
public interface ReaderFactory {
    Reader getReader();
}

//工厂类
public class JpgReaderFactory implements ReaderFactory {
    @Override
    public Reader getReader() {
        return new JpgReader();
    }
}

public class PngReaderFactory implements ReaderFactory {
    @Override
    public Reader getReader() {
        return new PngReader();
    }
}

//消费者
ReaderFactory factory=new JpgReaderFactory();
Reader  reader=factory.getReader();
reader.read();

ReaderFactory factory=new PngReaderFactory();
Reader  reader=factory.getReader();
reader.read();

添加新产品不需要修改原代码,满足开闭原则,但代码量激增.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值