【编程素质】设计模式-工厂模式:工厂方法、简单工厂、抽象工厂

时间:2022-05-13 20:31:51

1,工厂方法模式(Factory method)

(1)概念

   定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个(因为创建者类不需要指定实际创建的产品是哪一个),工厂方法让类把实例化推迟到子类。

   是常用的对象创建型设计模式,核心是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。

(2)场景:

   如:有一大堆不同的Pizza类,只有到了运行是,才能指定优化哪一个。这些是变化的把部分,若菜单改变,这部分代码也要改变。此时,提取出善变的这部分为独立类。

(3)优缺点

   优:

     将产品的“实现”从“使用”中解耦。

     完全实现“开-闭 原则”,实现了可扩展

(4)demo

   它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品

【编程素质】设计模式-工厂模式:工厂方法、简单工厂、抽象工厂

package factory;

public class Main {

public static void main(String[] args){
/**
* 工厂模式
* 根据FoctoryType:"one""two"不同,让类把实例化推迟到子类
*/
Factory factory = new OneFactory();
Product product = factory.FactoryMethod("one");
System.out.println(product.productName);

product = factory.FactoryMethod("two");
System.out.println(product.productName);
}
}
package factory;/** * 工厂抽象类 * 创建一个框架,让子类决定如何实现具体的产品 * @author luo * */public abstract class Factory {	public Product FactoryMethod(String productType){		Product product = CreateProduct(productType);		return product;			}	/**	 * 让子类去实现要生产什么产品	 */	public abstract Product CreateProduct(String productType);}
package factory;/** * 产品抽象类: * 所有产品都有实现这个接口,这样使用这些产品的类久可以引用这个类了 * @author luo * */public abstract class Product {	public String productName;}
package factory;/** * 具体产品类 * @author luo * */public class OneProduct extends Product{	public OneProduct(){		productName = "oneProduct";	}}
package factory;/** * 具体产品类 * @author luo * */public class TwoProduct extends Product{	public TwoProduct(){		productName = "twoProduct";	}}
package factory;import java.awt.image.DataBufferUShort;/** * 具体工厂类 * @author luo * */public class OneFactory extends Factory{	@Override	public Product CreateProduct(String productType) {		switch(productType){				case "one":			return new OneProduct();		case "two":			return new TwoProduct();		default:			break;		}		return null;	}	}

2,静态工厂(简单工厂Simple Factory)

(1)概念

   利用静态方法定义一个简单的工厂。(注意是一个工厂!)

(2)场景

   ①工厂类负责创建的对象比较少。

   ②对象决定创建出哪一种产品类的实例,而对如何创建对象不关心。(例如你到肯德基说你要鸡腿,要薯条,要饮料还是,,,这时肯德基是一个工厂,客户端只需要点明自己要什么就行)。

(3)优缺点

   优:

     不需要使用创建对象的方法来实例化对象。

   缺:

     ①不能通过继承来改变创建方法的行为。

      当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。

     ②违反了高内聚责任分配原则。

      由于工厂类集中了所有实例的创建逻辑,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

(4)实现:

   由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类这些产品类继承自一个父类或接口)的实例。


3,抽象工厂

(1)概念

   提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。


   这个接口的每个方法都负责创建一个具体产品,同时我们利用抽象工厂的子类来提供这些具体的做法,利用工厂方法来实现具体工厂。

(2)场景

   一个对象族(或者是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式

    例如:一个应用需要在三个不同平台上运行,则可以通过抽象工厂模式屏蔽掉操作系统对应用的影响,由不同的产品类去处理与操作系统交互的信息。

(3)优缺点

   优:
     ①它分离了具体的类
     ②它使得易于交换产品系列
     ③它有利于产品的一致性
   缺:
     难以支持新种类的产品

4,比较:

(1)工厂方法和抽象工厂

【编程素质】设计模式-工厂模式:工厂方法、简单工厂、抽象工厂