创建型--工厂模式

本文深入解析工厂模式,包括普通工厂方法模式、多个工厂方法模式及静态工厂方法模式。探讨其优点与缺点,展示如何通过工厂类创建实现了同一接口的不同类实例。

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

概念


建立一个工厂类,对实现了同一接口的一些类提供创建它们的对象的方法。

工厂模式分为三种:普通工厂方法模式、多个工厂方法模式、静态工厂方法模式。

优点:

  1. 屏蔽对象的具体创建逻辑,调用者只关心用来创建对象的工厂类(和类中方法)。
  2. 扩展性高,如果想增加一个产品,只需要创建产品类并在工厂类中修改代码。

缺点:
1.客户端创建对象时会依赖工厂类,如果想要提供新的创建新产品的工厂方法,必须对工厂类进行修改,这违背了闭包原则。由此,使用抽象工厂模式来符合闭包原则。
 

普通工厂方法模式


建立一个工厂类,对实现了同一接口的一些类提供创建对象的方法。

创建一个产品接口:Shape

package pattern.factory;

public interface Shape {
	   void draw();
}

创建实现产品接口的产品实体类:Rectangle ,Square ,Circle

package pattern.factory;

public class Rectangle implements Shape {	
	@Override
	public void draw() {
		System.out.println("Inside Rectangle::draw() method.");
	}
}
package pattern.factory;

public class Square implements Shape {
	@Override
	public void draw() {
		System.out.println("Inside Square::draw() method.");
	}
}
package pattern.factory;

public class Circle implements Shape {	
	@Override
	public void draw() {
		System.out.println("Inside Circle::draw() method.");
	}
}

创建一个工厂,用于生成,基于给定信息的实体类的对象:

package pattern.factory;

public class ShapeFactory {
	public Shape getShape(String shapeType){
		if(shapeType == null){
			return null;
	    }        
	    if(shapeType.equalsIgnoreCase("CIRCLE")){
	        return new Circle();
	    } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
	        return new Rectangle();
	    } else if(shapeType.equalsIgnoreCase("SQUARE")){
	        return new Square();
	    }
	    return null;
	}
}

客户端:使用该工厂类,通过传递类型信息来获取实体类的对象:

package pattern.factory;

public class FactoryPatternDemo {
	public static void main(String[] args) {
		  //创建一个工厂对象,用来获取产品对象
	      ShapeFactory shapeFactory = new ShapeFactory();
	      //获取 Circle 的对象,并调用它的 draw 方法
	      Shape shape1 = shapeFactory.getShape("CIRCLE");
	      shape1.draw();
	}
}

Output:
Inside Circle::draw() method.

 

多个工厂方法模式


对普通工厂方法模式的改进。在工厂类中提供多个工厂方法,分别创建不同的对象

创建一个接口:Shape
创建实现接口的产品实体类:Rectangle ,Square ,Circle

创建一个工厂接口,包含多个创建不同对象的工厂方法:

package pattern.factory;

public class ShapeFactory {
	public Shape getRectangle() {  //工厂方法1
		return new Rectangle(); 
	}
	public Shape getSquare() {    //工厂方法2
		return new Square(); 
	}
	public Shape getCircle() {    //工厂方法3
		return new Circle(); 
	}
}

客户端:使用该工厂类,通过工厂方法来获取实体类的对象:

package pattern.factory;

public class FactoryPatternDemo {
	public static void main(String[] args) {
		ShapeFactory factory = new ShapeFactory ();  
        Shape shape = factory.getCircle();
        shape.draw();
	}
}

Output:
Inside Circle::draw() method.

 

静态工厂方法模式


将多个工厂方法模式里的工厂方法置为静态的,使其不需要创建实例,可以直接调用

创建一个接口:Shape
创建实现接口的产品实体类:Rectangle ,Square ,Circle

创建一个工厂接口,包含多个创建不同对象的工厂方法:

package pattern.factory;

public class ShapeFactory {
	public static Shape getRectangle() {  //静态工厂方法1
		return new Rectangle(); 
	}
	public static Shape getSquare() {    //静态工厂方法2
		return new Square(); 
	}
	public static Shape getCircle() {    //静态工厂方法3
		return new Circle(); 
	}
}

客户端:使用该工厂类,通过静态工厂方法来获取实体类的对象:

package pattern.factory;

public class FactoryPatternDemo {
	public static void main(String[] args) {
        Shape shape = ShapeFactory .getCircle();
        shape.draw();
	}
}

Output:
Inside Circle::draw() method.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值