zoukankan      html  css  js  c++  java
  • factory工厂模式之抽象工厂AbstractFactory

    * 抽象工厂:

      意图在于创建一系列互相关联或互相依赖的对象。
    * 每个工厂都会创建一个或多个一系列的产品
    * 适用于:产品不会变动,开始时所有产品都创建好,然后根据分类获取想要的 某一类产品(很像spring容器)

    代码解释:

    1.创建产品接口:手机和它的实现子类

    //手机接口
    public interface MobileProduct {
        
    }
    
    //实现子类Android
    public class Android implements MobileProduct{
    
        public Android() {
            System.out.println("生产一个Android手机...");
        }
    }
    
    //实现子类Apple
    public class Apple implements MobileProduct{
    
        public Apple() {
            System.out.println("生产一个Apple手机...");
        }
    }

    2.创建产品接口2:汽车,和它的实现子类

    //第二种产品:汽车
    public interface CarProduct {
        
    }
    
    //实现子类1:宝马
    public class BaoMa implements CarProduct{
    
        public BaoMa() {
            System.out.println("生产一个宝马汽车...");
        }
    }
    
    //实现子类2:奔驰
    public class BenChi implements CarProduct{
    
        public BenChi() {
            System.out.println("生产一个奔驰汽车...");
        }
    }

    3.创建抽象父类(或者抽象接口)和方法:可以生产手机和汽车,但是具体生产那种手机和汽车,不一定(由子类决定),因为里面的方法返回也是抽象的

    //这里写接口也可以,抽象类个人理解:具体能看见的事物;接口:看不见的
    public abstract class AbstractFactory {
        
        /**
         * 生产一个产品
         * @return
         */
        public abstract MobileProduct processMobile();
        /**
         * 生产一个产品
         * @return
         */
        public abstract CarProduct processCar();
    }

    4.实现2个生产系列产品的工厂

    /**
     * 生产 产品系列:一个苹果,一个宝马
     * @author mlxs
     *
     */
    public class FactoryMothedA extends AbstractFactory{
    
        @Override
        public MobileProduct processMobile() {
            return new Apple();
        }
    
        @Override
        public CarProduct processCar() {
            return new BaoMa();
        }
        
    }
    /**
     * 生产方式B 产品系列:一个安卓,一个奔驰
     * @author mlxs
     *
     */
    public class FactoryMothedB extends AbstractFactory{
    
        @Override
        public MobileProduct processMobile() {
            return new Android();
        }
    
        @Override
        public CarProduct processCar() {
            return new BenChi();
        }
    }

    5.客户端测试

    public static void main(String[] args) {
            System.out.println("-----------------生产系列A:苹果和宝马-------------------");
            //生产系列A:苹果和宝马
            AbstractFactory factory = new FactoryMothedA();
            factory.processMobile();
            factory.processCar();
            
            System.out.println("
    -----------------生产系列B:安卓和奔驰-------------------"); 
        //生产系列B:安卓和奔驰
        AbstractFactory factoryB = new FactoryMothedB();
        factory.processMobile(); factory.processCar(); }

    6.结果:

    -----------------生产系列A:苹果和宝马-------------------
    生产一个Apple手机...
    生产一个宝马汽车...
    
    -----------------生产系列B:安卓和奔驰-------------------
    生产一个Apple手机...
    生产一个宝马汽车...

    缺陷:有新产品的时候,改动地方很多(产品类、系列工厂类、抽象工厂类都要改)

    逃避不一定躲得过,面对不一定最难过
  • 相关阅读:
    Spring中使用RedisTemplate操作Redis(spring-data-redis)
    Cron表达式
    自己搭建v,p,n过程
    CentOS 7安装与配置jdk-8u162
    .net自动生成版本号
    关于webapi 返回的类型的笔记
    多个系统间交互-灰度发布-一些笔记
    Unity的使用
    mysql中查询"_"这种特殊字符
    关于MVC中DropDownListFor的一个bug
  • 原文地址:https://www.cnblogs.com/yangzhenlong/p/5152427.html
Copyright © 2011-2022 走看看