码迷,mamicode.com
首页 > 其他好文 > 详细

工厂模式—工厂方法与抽象工厂的战争

时间:2017-05-29 21:08:12      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:cto   指定   技术   run   创建者   开始   img   factory   string   

概述

什么是工厂方法?什么是抽象工厂?

工厂方法是指工厂生产产品,而抽象工厂是生产产品系列。例如,工厂方法是只生产运输工具比如马车、公共汽车、自行车,而抽象工厂生产轮胎、螺丝钉交通工具零件。

工厂方法模式定义了一个创建对象的接口,但由子类决定实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

简单工厂

技术分享

 交通工具创建者类

public interface VehicleFactory {
    Vehicle create();
}

public class BicycleFactory implements VehicleFactory {

    @Override
    public Vehicle create() {
        return new Bicycle();
    }

}

public class CarriageFactory implements VehicleFactory{
    public Vehicle create() {
        return new Carriage();
    }
}

public class BusFactory implements VehicleFactory{

    @Override
    public Vehicle create() {
        return new Bus();
    }

}

 产品类

public interface Vehicle {
    void run();
}

public class Bicycle implements Vehicle {
    @Override
    public void run() {
        System.out.println("自行車 蹬蹬蹬");
    }
}

public class Bus implements Vehicle{
    @Override
    public void run() {
        System.out.println("bus 咚咚咚");
        
    }
}

public class Carriage implements Vehicle {

    @Override
    public void run() {
        System.out.println("马车   撇撇撇");

    }

}    

客户端

public class Client {
    public static void main(String[] args) {
        VehicleFactory factory=new CarriageFactory();
        Vehicle vehicle=factory.create();
        vehicle.run();
    }
}

技术分享

抽象工厂

 技术分享

public interface AbstractFactory {
    //骑的坐骑
    Vehicle createVehicle();
    //拿的武器
    Weapon createWeapon();
    //补充的粮食
    Food createFood();
}

class CarriageFacetory implements AbstractFactory{

    @Override
    public Vehicle createVehicle() {
        return new Carriage();
    }

    @Override
    public Weapon createWeapon() {
        return new AK47();
    }

    @Override
    public Food createFood() {
        return new SteamedBun();
    }

}

class BusFactory implements AbstractFactory{

    @Override
    public Vehicle createVehicle() {
        return new Bus();
    }

    @Override
    public Weapon createWeapon() {
        return new AK47();
    }

    @Override
    public Food createFood() {
        return new Apple();
    }

}

 骑的交通工具

public interface Vehicle {
    void run();
}

class Bus implements Vehicle{
    @Override
    public void run() {
        System.out.println("bus 咚咚咚");
        
    }
}

public class Carriage implements Vehicle {
    @Override
    public void run() {
        System.out.println("马车   撇撇撇");

    }
}

 拿的武器

public interface Weapon {
    void shot();
}

class AK47 implements Weapon{
    @Override
    public void shot() {
        System.out.println("开Bus的手持ak47");
        
    }
}

class Stick implements Weapon{
    public void shot() {
        System.out.println("骑马的拿着铁棍!");
    }
}

吃的粮食

public interface Food {
    void eat();
}

class Apple implements Food {
    @Override
    public void eat() {
        System.out.println("开bus的吃苹果");
    }
}

class SteamedBun implements Food{
    @Override
    public void eat() {
        System.out.println("骑马的吃馒头");
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        AbstractFactory factory=new BusFactory();
        
        Food f=factory.createFood();
        Vehicle v=factory.createVehicle();
        Weapon w=factory.createWeapon();
        
        f.eat();
        v.run();
        w.shot();
    }
}

总结

工厂方法与抽象工厂各有什么优缺点?

工厂方法一直都是围绕着产品这一个纬度,着重考虑怎么应对产品的变化。例如,新增一种类型的交通工具,并不要修改源码就能拓展成功,缺点就是工厂泛滥。

抽象工厂就是针对产品系列可拓展,例如新增某一种系列,人开着飞机去战斗,那么可以交通工具汽车,可以吃榴莲,手持导弹,可以轻松拓展进去。但是,弊端就是,系列工厂最开始要考虑周全,如果中途新增人还要有特定的服装,那就会非常麻烦。对于产品拓展不足。

工厂模式—工厂方法与抽象工厂的战争

标签:cto   指定   技术   run   创建者   开始   img   factory   string   

原文地址:http://www.cnblogs.com/qiuyong/p/6918925.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!