设计模式——工厂模式

介绍

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时无需对客户端暴露创建的逻辑,只需一个公共的接口便可指向创建的对象

意图

定义一个创建对象的接口,让其子类决定实例化哪一个工厂类

何时使用

明确计划在不同的条件创建不同的实例

如何解决

让子类实现工厂接口,返回也是一个抽象的产品

关键代码

创建过程在其子类中执行

实例

需要一辆车,直接从工厂里去取货,不许关这些车辆是怎么做出来的

设计一个连接服务器的框架,采用三种协议,POP3,IMAP,HTTP,可以把三个座位产品类,共同实现一个借口

使用场景

作为创建类的方式,在任何需要申城复杂对象的地方都可以使用工厂类。

注,在实现复杂类的时候适合使用工厂类,而对于简单的类,new即可,无需用工厂类。如果使用工厂类,就会引入一个工厂类,增加了系统的复杂性。

1. 简单工厂模式

Shape.java

public interface Shape {
    void draw();
}

Circle.java

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

Rectangle.java

public class Rectangle implements Shape{
    public void draw() {
        System.out.println("Inside Rectangle draw");
    }
}

Square.java

public class Square implements Shape{
    public void draw() {
        System.out.println("Inside Square draw");
    }
}

Shapefactory.java

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

FactoryPatternDemo

public class FactoryPatternDemo {
    public static void main(String[] args){
        Shapefactory shapefactory = new Shapefactory();

        Shape shape_1 = shapefactory.getShape("RECTANGLE");
        shape_1.draw();

        Shape shape_2 = shapefactory.getShape("CIRCLE");
        shape_2.draw();

        Shape shape_3 = shapefactory.getShape("SQUARE");
        shape_3.draw();

        Shape shape_4 = shapefactory.getShape("");
        System.out.println(shape_4);
    }
}

结果

Inside Rectangle draw
Inside Circle draw()
Inside Square draw
null

2. 抽象方法

public interface Noodles {
    void taste();
}
public class LanzhouNoodles implements Noodles {
    @Override
    public void taste() {
        System.out.println("兰州拉面劲道、有味");

    }
}
public class ChaoxianNoodles implements Noodles {
    @Override
    public void taste() {
        System.out.println("朝鲜面酸爽,好吃");
    }
}
public interface NoodlesFactory {
    Noodles createNoodles();
}
public class LanzhouFactory implements NoodlesFactory{

    @Override
    public Noodles createNoodles() {
        return new LanzhouNoodles();
    }
}
public class ChaoxianFatory implements NoodlesFactory{
    @Override
    public Noodles createNoodles() {
        return new ChaoxianNoodles();
    }
}

测试

public class FactoryTest {
    public static void main(String[] args) {
        NoodlesFactory factory = new ChaoxianFatory();
        Noodles noodles = factory.createNoodles();
        noodles.taste();

        System.out.println("-------------");

        NoodlesFactory factory1 = new LanzhouFactory();
        Noodles noodles1 = factory1.createNoodles();
        noodles1.taste();
    }
}

结果

朝鲜面酸爽,好吃
-------------
兰州拉面劲道、有味

3. 多对象

public interface Drink {
    void feel();
}
public class CokeDrink implements Drink{
    @Override
    public void feel() {
        System.out.println("可乐真可口");
    }
}
public class Walter implements Drink{
    @Override
    public void feel() {
        System.out.println("白开水贼解渴");
    }
}
public interface FoodFactory {
    Noodles createNoodles();
    Drink createDrink();
}
public class LanzhouFactory implements FoodFactory {

    @Override
    public Noodles createNoodles() {
        return new LanzhouNoodles();
    }

    @Override
    public Drink createDrink() {
        return new Walter();
    }
}
public class ChaoxianFatory implements FoodFactory {
    @Override
    public Noodles createNoodles() {
        return new ChaoxianNoodles();
    }

    @Override
    public Drink createDrink() {
        return new CokeDrink();
    }
}

测试

public class FactoryTest {
    public static void main(String[] args) {
        FoodFactory factory = new ChaoxianFatory();
        Noodles noodles = factory.createNoodles();
        noodles.taste();
        Drink drink = factory.createDrink();
        drink.feel();

        System.out.println("-------------");

        FoodFactory factory1 = new LanzhouFactory();
        Noodles noodles1 = factory1.createNoodles();
        noodles1.taste();
        Drink drink1 = factory1.createDrink();
        drink1.feel();
    }
}

结果

朝鲜面酸爽,好吃
可乐真可口
-------------
兰州拉面劲道、有味
白开水贼解渴

  

原文地址:https://www.cnblogs.com/kaituorensheng/p/6483913.html