• 设计模式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();
        }
    }
  • 相关阅读:
    作为Bootstrap中文站维护者-我们再次翻译BootstrapVue项目
    在vs2017和vs2019下发布应用之Windows程序打包-附图标修改和默认安装路径定义全教程
    Windows应用开发中程序窗口中的各种图标尺寸规划
    SVN设置忽略文件列表以及丢失了预定增加的文件解决方法
    基于VuePress构建高基于markdown语法的网站全教程
    国家高新技术企业门户与移动全生态开发套件-Zooma!逐浪CMS v8.1.4正式发布
    Json跨域登录问题的之Access-Control-Allow-Origin 站点跨域请求的问题
    IIS设置URL重写,实现页面的跳转的重定向方法
    163邮件:554 DT:SPM 163 smtp11,D8CowABHLj7jX_BdY+q6Ag--.21946S2 1576034275,please see http://mail.163.com/help/help_spam_16.htm?ip=117.22.255.130&hostid=smtp11&time=1576034275
    读《阿里巴巴Java开发手册 1.4.0》笔记
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/9341737.html
Copyright © 2020-2023  润新知