您的位置:首页 > 编程语言

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

2016-10-20 21:40 405 查看

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)工厂方法和抽象工厂

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐