文章目录
工厂模式
实现对象创建者和调用者分离. 实例化对象不使用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();
添加新产品不需要修改原代码,满足开闭原则,但代码量激增.