• 设计模式2-工厂模式


    工厂模式详解

    特点:

    • 1、 隐藏复杂的逻辑处理过程, 只关心执行结果。

    工厂模式有三种:

    • 1、简单工厂,功能强大,但是可扩展性不强
    • 2、工厂方法,独立分工,但是学习成本过高
    • 3、抽象工厂,简单工厂和工厂方法的结合体

    我们以汽车制造来说,假如一个4S店需要选购一批汽车,从宝马、奔驰、奥迪生产厂家拿到这些汽车。 
    我们通过工厂模式来实现,4S店选购到这些汽车。

    简单工厂模式

    解刨:从一个厂家拿到宝马、奔驰、奥迪,同一套工艺标准。 
    缺点:无法进行个性定制化。

    定义工艺标准,也就是实现一个Car接口

    public interface Car {
        String  getName();
    }

    生产奥迪车,同一个工厂,相同的标准

    public class Audi implements Car{
        public String getName() {
            return "Audi";
        }
    }

    生产奔驰车,同一个工厂,相同的标准

    public class Benz implements Car {
        public String getName() {
            return "Benz";
        }
    }

    生产宝马车,同一个工厂,相同的标准

    public class Bmw implements Car{
        public String getName() {
            return "Bmw";
        }
    }

    工厂开始准备加工,定义了一个工厂类

    public class SimpleFactory {
        public Car getCar(String name) {
            if ("Bmw".equalsIgnoreCase(name)) {
                return new Bmw();
            } else if ("Benz".equalsIgnoreCase(name)) {
                return new Benz();
            } else if ("Audi".equalsIgnoreCase(name)) {
                return new Audi();
            } else {
                System.out.println("这款汽车暂无生产");
                return null;
            }
    
        }
    }

    根据需要的汽车开始生产,定义一个测试类

    public class SimpleFactoryTest {
        public static void main(String[] args) {
            // 实现统一管理、专业化管理
            Car car = new SimpleFactory().getCar("Bmw");
            System.out.println("该工厂生产了:"+car.getName());
        }
    }

    工厂方法模式

    解刨:定义一套公开标准,然后不同的汽车不同的厂家生产 
    宝马工厂生产宝马,奔驰工厂生产奔驰,有自己的个性化定制。

    缺点:有的时候我们只要一家厂商,要对多家厂商进行筛选

    定义公开的标准,如质量ISO9001,定义公开的接口

    public interface FunFactory {
        Car getCar();
    }

    宝马工厂按照公开的标准生产,然后自己做了一些定制化生产

    public class BmwFactory implements FunFactory {
        public Car getCar() {
            return new Bmw();
        }
    }

    奔驰工厂按照公开的标准生产,然后自己做了一些定制化生产

    public class BenzFactory implements FunFactory {
        public Car getCar() {
            return new Benz();
        }
    }

    奥迪工厂按照公开的标准生产,然后自己做了一些定制化生产

    public class AudiFactory implements FunFactory {
        public Car getCar() {
            return new Audi();
        }
    }

    不同的工厂生产不同的汽车

    public class FunFactoryTest {
        public static void main(String[] args) {
            FunFactory factory=new AudiFactory();
            System.out.println(factory.getCar());
            factory=new BmwFactory();
            System.out.println(factory.getCar());
            factory=new BenzFactory();
            System.out.println(factory.getCar());
    
        }
    }

    抽象工厂模式

    解刨:第三代理品牌,代理了三家汽车制造公司,然后卖给4S店,赚取中间差价。

    第三方代理工厂,给你默认推荐和定制化生产

    #代理工厂
    public abstract class AbstractFactory {
        abstract Car getCar();
        //这段代码动态配置的功能
        public Car getCar(String name) {
            if ("Bmw".equalsIgnoreCase(name)) {
                return new BmwFactory().getCar();
            } else if ("Benz".equalsIgnoreCase(name)) {
                return new BenzFactory().getCar();
            } else if ("Audi".equalsIgnoreCase(name)) {
                return new AudiFactory().getCar();
            } else {
                System.out.println("这个商品暂无生产");
                return null;
            }
    
        }
    }
    #代理工厂品牌包装了
    public class DefaultFactory extends  AbstractFactory{
        private AudiFactory factory=new AudiFactory();
        Car getCar() {
    
            return factory.getCar();
        }
    }

    奔驰工厂

    public class BenzFactory extends AbstractFactory {
        public Car getCar() {
            return new Benz();
        }
    }

    宝马工厂

    public class BmwFactory extends AbstractFactory {
        public Car getCar() {
            return new Bmw();
        }
    }

    奥迪工厂

    public class AudiFactory extends AbstractFactory {
        public Car getCar() {
            return new Audi();
        }
    }
  • 相关阅读:
    建立自己的影响力
    在病房垒代码
    知乎确实不错
    不在乎你用到了什么技术,而在于你提供了哪些有价值的东西
    oschina上有不少好的项目
    我为何坚守Java?
    掌握了学习方法才能学到更多知识
    Jrebel实现Jetty 热部署
    互联网到底能干什么?我们还能干些什么?
    centos 阿里云 安装VNC Viewer
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/9341737.html
Copyright © 2020-2023  润新知