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


    概述

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

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

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

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

    简单工厂

     交通工具创建者类

    public interface VehicleFactory {
        Vehicle create();
    }
    

    public class BicycleFactory implements VehicleFactory {

    @Override
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle create() {
        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Bicycle();
    }
    

    }

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

    public class BusFactory implements VehicleFactory{

    @Override
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle create() {
        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> 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
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {
        System.out.println(</span>"马车   撇撇撇"<span style="color: #000000;">);
    
    }
    

    }

    客户端

    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
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle createVehicle() {
        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Carriage();
    }
    
    @Override
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Weapon createWeapon() {
        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> AK47();
    }
    
    @Override
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Food createFood() {
        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> SteamedBun();
    }
    

    }

    class BusFactory implements AbstractFactory{

    @Override
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Vehicle createVehicle() {
        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Bus();
    }
    
    @Override
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Weapon createWeapon() {
        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> AK47();
    }
    
    @Override
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Food createFood() {
        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> 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</span>=<span style="color: #000000;">factory.createFood();
        Vehicle v</span>=<span style="color: #000000;">factory.createVehicle();
        Weapon w</span>=<span style="color: #000000;">factory.createWeapon();
        
        f.eat();
        v.run();
        w.shot();
    }
    

    }

    总结

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

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

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

    ???

  • 相关阅读:
    《JavaScript高级程序设计》读书笔记 ---继承
    技术人员在小公司成长 vs 大公司成长路径和建议
    原生JS forEach()和map()遍历的区别以及兼容写法
    《JavaScript高级程序设计》读书笔记 ---创建对象
    《JavaScript高级程序设计》读书笔记 ---理解对象
    《JavaScript高级程序设计》读书笔记 ---小结
    《JavaScript高级程序设计》读书笔记 ---单体内置对象
    《JavaScript高级程序设计》读书笔记 ---基本包装类型
    《JavaScript高级程序设计》读书笔记 ---Function 类型
    《JavaScript高级程序设计》读书笔记 ---RegExp 类型
  • 原文地址:https://www.cnblogs.com/qiuyong/p/6918925.html
Copyright © 2020-2023  润新知