设计模式--工厂模式

蹲街弑〆低调 提交于 2020-02-15 15:50:58

工厂模式

定义:分为简单工厂模式,工厂方法模式和抽象工厂模式,它们都属于设计模式中的创建型模式其主要功能都是帮助我们把对象的实例化部分抽取出来,

    目的是降低系统中代码耦合度,并且增强了系统的扩展性。

A. 简单工厂模式

  优点:在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责

  缺点:工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码逻辑将会非常复杂。

  图解:


package com.offcn.designpattern.factorypattern;public class SimpleFactoryPattern {    public static void main(String[] args) {        Phone phone = SimpleFactory.create("oppo");        phone.getPhoneName();        Phone phone1 = SimpleFactory.create("vivo");        phone1.getPhoneName();    }}interface Phone{    void getPhoneName();}class Oppo implements Phone{    @Override    public void getPhoneName() {        System.out.println("oppo手机");    }}class Vivo implements Phone{    @Override    public void getPhoneName() {        System.out.println("vivo手机");    }}class SimpleFactory{    public static Phone create(String name){        if(name.equals("oppo")){            return new Oppo();        }else if(name.equals("vivo")){            return new Vivo();        }else{            return null;        }    }}

输出:

B.工厂方法模式

 优点:是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。

 缺点:更换另外一种产品,仍然需要修改实例化的具体工厂类。而且一个具体工厂只能创建一种具体产品

 图解:


package com.offcn.designpattern.factorypattern;public class FactoryMethodPattern {    public static void main(String[] args) {        CreateOppo phone = new CreateOppo();        phone.create().getPhoneName();        CreateVivo phone1 = new CreateVivo();        phone1.create().getPhoneName();    }}//抽象手机类abstract class Phone{    public abstract void getPhoneName();}class Oppo extends Phone{    @Override    public void getPhoneName() {        System.out.println("oppo手机");    }}class Vivo extends Phone{    @Override    public void getPhoneName() {        System.out.println("vivo手机");    }}//与简单工厂模式相比,此处将对象的创建抽象成一个接口或抽象类//抽象工厂类abstract class Factory{    public abstract Phone create();}class CreateOppo extends Factory{    @Override    public Phone create() {        return new Oppo();    }}class CreateVivo extends Factory{    @Override    public Phone create() {        return new Vivo();    }}
 

输出:

C.抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口/抽象类,而无需指定它们具体的类,抽象工厂模式又称为Kit模式,属于对象创建型模式

 优点:是对工厂方法模式的进一步扩展,在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,是一对一的关系。但需要一个具体的工厂生产多种产品对象

    就需要用到抽象工厂模式了。它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,

    不会出现在客户代码中。

 缺点:如果要增加一个类或一个表,需要改动的代码并不比工厂方法模式要少。

 图解:

package com.offcn.designpattern.factorypattern;

public class AbstractFactoryPattern {
    public static void main(String[] args) {
        ProductFactory factory = new ProductFactory();
        factory.createPhone().call();
        factory.createPhone().writeEmail();
        ProductFactory factory1 = new ProductFactory();
        factory1.createChildren().play();
        factory1.createChildren().word();
    }
}
interface UserPhone{
    void call();
    void writeEmail();
}
class VivoPhone implements UserPhone{

    @Override
    public void call() {
        System.out.println("使用vivo手机打电话");
    }

    @Override
    public void writeEmail() {
        System.out.println("使用vivo手机发短信");
    }
}
interface Person{
    public void word();
    public void play();
}
class Children implements Person{

    @Override
    public void word() {
        System.out.println("小孩在写作业");
    }

    @Override
    public void play() {
        System.out.println("小孩在玩游戏");
    }
}
//抽象工厂,可以生产多种产品
abstract class AllFactory{
   public abstract UserPhone createPhone();
   public abstract Person createChildren();
}
class ProductFactory extends AllFactory{


    @Override
    public UserPhone createPhone() {
        return new VivoPhone();
    }

    @Override
    public Person createChildren() {
        return new Children();
    }
}

应用场景:

1)         当不知道该使用对象的确切类型的时候

2)         当希望为库或框架提供扩展其内部组件的方法时

主要优点:

1)         将具体产品和创建者解耦

2)         符合单一职责原则

3)         符合开闭原则

源码中的应用:

1)         静态工厂方法

Calendar getInstance()

Java.text.NumberFormat.getInstance()

Java.util.ResourceBundle.getBundle()

2)         工厂方法

Java.net.URLStreamHandlerFactory

Javax.xml.bind.JAXBContext.createMarshaller

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!