设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)

2、工厂模式
简单工厂模式

简单工厂模式定义了一个创建对象的接口,但是由子类决定要实例化的类是哪一个,也就是说工厂模式让实例化推迟到子类
工厂类中根据指定的信息生成对象的实例对象。

代码实现

1、创建定义的接口

public interface Shape {
    void draw();
}

2、创建接口的实现类

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("这是圆形");
    }
}

public class Triangle implements Shape {
    @Override
    public void draw() {
        System.out.println("这是三角形");
    }
}

public class Ellipse implements Shape {
    @Override
    public void draw() {
        System.out.println("这是椭圆");
    }
}

3、创建一个工厂,生成基于给定信息的实例对象

public class ShapeFactory {
    /**
     * @return
     * @Date 2020/5/12 13:52
     * @Author jiangheng
     * @Description //TODO 根据条件生成实例对象
     **/
    public Shape getShape(String name){
        if("".equals(name)|| null == name){
            return null;
        }else if("circle".equals(name)){
            return new Circle();
        }else if ("ellipse".equals(name)){
            return new Ellipse();
        }else if("triangle".equals(name)){
            return new Triangle();
        }
        return null;
    }
}

4、通过该工厂类,通过给定的信息获取生产实例对象的方法并执行

public class FactoryPatternDemo {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();
        shapeFactory.getShape("circle").draw();
        shapeFactory.getShape("ellipse").draw();
        shapeFactory.getShape("triangle").draw();
    }
}

简单工厂模式的缺点就是每有一种的新的产品时都需要增加一个产品类和修改工厂类的方法,如果产品很多的话就会导致工厂类的方法很复杂,效率很低。

工厂方法模式

工厂方法模式有一个抽象的工厂类,由具体的工厂类实现具体的产品

代码实现

1、创建定义的接口

public interface Shape {
    void draw();
}

2、创建接口的实现类

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("这是圆形");
    }
}

public class Triangle implements Shape {
    @Override
    public void draw() {
        System.out.println("这是三角形");
    }
}

public class Ellipse implements Shape {
    @Override
    public void draw() {
        System.out.println("这是椭圆");
    }
}

3、创建工厂的接口(用于生产产品)

public interface FactoryShape {
    Shape createShape();
}

4、创建具体的工厂(生产具体的产品类)

public class EllipseFactory implements FactoryShape
{
    @Override
    public Shape createShape() {
        return new Ellipse();
    }
}

public class CircleFactory implements FactoryShape
{
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

public class TriangleFactory implements FactoryShape
{
    @Override
    public Shape createShape() {
        return new Triangle();
    }
}

5、消费者取车

public class Consumer {
    public static void main(String[] args) {
       new CircleFactory().createShape().draw();
       new TriangleFactory().createShape().draw();
       new EllipseFactory().createShape().draw();
    }
}

工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。
当有一种新的产品时,就会有新的产品类和新的产品工厂产生。这一点还是不太好。

抽象工厂模式

抽象工厂模式是工厂方法模式的升级版,当每种图形有了多种设置之后(背景颜色,大小等),这时就需要使用
抽象工厂模式。

代码实现
public interface Shape {
    void draw();
}
public interface Color {
}

public interface Size {
}

2、创建接口的实现类

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("这是圆形");
    }
}

public class Triangle implements Shape {
    @Override
    public void draw() {
        System.out.println("这是三角形");
    }
}

public class Ellipse implements Shape {
    @Override
    public void draw() {
        System.out.println("这是椭圆");
    }
}

public class Black implements Color{
    public Black() {
        System.out.println("背景是黑色");
    }
}

public class Red implements Color{
    public Red() {
        System.out.println("背景是红色");
    }
}

public class Small implements Size{
    public Small() {
        System.out.println("小型号");
    }
}

public class Big implements Size{
    public Big() {
        System.out.println("大型号");
    }
}

4、创建具体的工厂(生产具体的产品类)

public class EllipseFactory implements FactoryShape
{
    @Override
    public Shape createShape() {
        return new Ellipse();
    }
    
    @Override
    public Size CreateSize() {
        return new Small();
    }

    @Override
    public Color CreateColor() {
        return new Black();
    }
}

public class CircleFactory implements FactoryShape
{
    @Override
    public Shape createShape() {
        return new Circle();
    }
    
    @Override
    public Size CreateSize() {
        return new Big();
    }
    
    @Override
    public Color CreateColor() {
        return new Red();
    }
}

public class TriangleFactory implements FactoryShape
{
    @Override
    public Shape createShape() {
        return new Triangle();
    }
    
     @Override
    public Size CreateSize() {
        return new Big();
    }
    
    @Override
    public Color CreateColor() {
        return new Black();
    }
}

5、消费者取车

public class Consumer {
    public static void main(String[] args) {
        CircleFactory circle = new CircleFactory();
        TriangleFactory triangle = new TriangleFactory();
        EllipseFactory ellipse = new EllipseFactory();
        circle.createShape().draw();
        triangle.createShape().draw();
        ellipse.createShape().draw();
        circle.CreateColor();
        circle.CreateSize();
        triangle.CreateColor();
        triangle.CreateSize();
        ellipse.CreateColor();
        ellipse.CreateSize();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值