Java设计模式--工厂模式

一、工厂模式的简介:

	工厂模式的作用:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽起来,达到提高灵活性的目的。
	 工厂模式分类:
		1)简单工厂模式(Simple Factory):不利于产生系列产品
		2)工厂方法模式(Factory Method):又称为多形性工厂;
		3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品

二、简单工厂模式

简单工厂模式又称静态工厂方法模式,目的是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一个类。
适用范围:
1、在编码时不能预见需要创建哪一种类的实例。
2、一个类使用他的子类来创建对象
3、开发人员,不希望创建了哪个类的实例以及如何创建实例的信息暴露给外部程序
结构图:

例子:
</pre><pre name="code" class="java">// 产品接口         
public interface Product {   
  
    public void getName();   
  
}   
  
// 具体产品A   
public class ProductA implements Product {   
  
    public void getName() {   
        System.out.println("  I am ProductA  ");   
    }   
  
}   
  
// 具体产品B   
public class ProductB implements Product {   
  
    public void getName() {   
        System.out.println("  I am ProductB  ");   
    }   
  
}   
  
// 工厂类   
public class ProductCreator {   
  
    public Product createProduct(String type) {   
        if (" A ".equals(type)) {   
            return new ProductA();   
        }   
        if (" B ".equals(type)) {   
            return new ProductB();   
        } else  
            return null;   
    }   
  
    public static void main(String[] args) {   
        ProductCreator creator = new ProductCreator();   
        creator.createProduct(" A ").getName();   
        creator.createProduct(" B ").getName();   
    }   
}  

三、工厂方法模式

工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。 
反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。

四、抽象工厂模式

1. 抽象工厂模式可以说是简单工厂模式的扩展,它们主要的区别在于需要创建对象的复杂程度上。 
在抽象工厂模式中,抽象产品可能是一个或多个,从而构成一个或多个产品族。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。 
2. 抽象工厂模式的结构 
https://i-blog.csdnimg.cn/blog_migrate/784869f71398b122971e48cf1509f842.gif
//抽象产品角色
public interface Moveable {
    void run();
}
//具体产品角色
public class Plane implements Moveable {
    @Override
    public void run() {
        System.out.println("plane....");
    }
}

public class Broom implements Moveable {
    @Override
    public void run() {
        System.out.println("broom.....");
    }
}

//抽象工厂
public abstract class VehicleFactory {
    abstract Moveable create();
}
//具体工厂
public class PlaneFactory extends VehicleFactory{
    public Moveable create() {
        return new Plane();
    }
}
public class BroomFactory extends VehicleFactory{
    public Moveable create() {
        return new Broom();
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        VehicleFactory factory = new BroomFactory();
        Moveable m = factory.create();
        m.run();
    }
}

五、小结 
在以下情况下,应当考虑使用抽象工厂模式。 
  首先,一个系统应当不依赖于产品类实例被创立,组成,和表示的细节。这对于所有形态的工厂模式都是重要的。 
  其次,这个系统的产品有多于一个的产品族。 
  第三,同属于同一个产品族的产品是设计成在一起使用的。这一约束必须得在系统的设计中体现出来。 
  最后,不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节。 
  其中第二丶第三个条件是我们选用抽象工厂模式而非其它形态的工厂模式的关键性条件。

  



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值