zoukankan      html  css  js  c++  java
  • 设计模式(三十一)------23种设计模式(23):简单工厂模式

    使用频率:★★★★☆

    一、什么是简单工厂模式

    一个工厂方法,依据传入的参数,生成对应的具体产品对象;

    二、补充说明

    不属于23种GOF设计模式;

    工厂方法一般设成静态方法,返回值一般是抽象类或接口,具体的产品类一般继承或实现抽象类、接口;

    优点:产品使用者不需要关心产品类的创建过程,与具体产品的实现类达到解耦的效果;

    缺点:违背"开放--封闭"原则(OCP),因为新增一个产品类的时候,需要修改原先的工厂方法;

    适用场合:当工厂类负责创建的对象比较少的时候;

    三、角色

    • 抽象产品
    • 具体产品
    • 具体工厂
    • 产品使用者

    具体产品继承抽象产品;

    单个具体工厂负责生产不同的具体产品;

    产品使用者使用单个具体工厂生产的不同的具体产品;

    四、例子

    类关系图:

    代码:

    【抽象产品类】首先,定义一个抽象父亲类,拥有一个name属性和打印name的方法,其次还有若干doSomething方法:

    复制代码
    package com.pichen.dp.creationalpattern.simplefactory;
    
    public abstract class Father {
        private String name;
    
        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
    
        /**
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
        
        public abstract void printName();
        
        public abstract void doSomething01();
        public abstract void doSomething02();
        public abstract void doSomething03();
    }
    复制代码

    【具体产品类】定义具体的中国父亲类和美国父亲类,继承抽象父亲类,并实现printName等方法:

    复制代码
    package com.pichen.dp.creationalpattern.simplefactory;
    
    public class ChineseFather extends Father{
        public ChineseFather(String name) {
            this.setName(name);
        }
        
        
        
        @Override
        public void printName() {
            System.out.println(this.getClass().getName() + ":" + this.getName());
        }
        @Override
        public void doSomething01() {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void doSomething02() {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void doSomething03() {
            // TODO Auto-generated method stub
            
        }
    
    }
    复制代码
    复制代码
    package com.pichen.dp.creationalpattern.simplefactory;
    
    public class AmericanFather extends Father{
        public AmericanFather(String name) {
            this.setName(name);
        }
        
        
        
        @Override
        public void printName() {
            System.out.println(this.getClass().getName() + ":" + this.getName());
        }
        @Override
        public void doSomething01() {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void doSomething02() {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void doSomething03() {
            // TODO Auto-generated method stub
            
        }
    
    }
    复制代码

    【简单工厂类】定义一个简单共产类,并定义一个静态生产方法,根据传进来的type参数生成对应的具体父亲类:

    复制代码
    package com.pichen.dp.creationalpattern.simplefactory;
    
    import com.pichen.dp.common.exception.DPException;
    
    public class SimpleFactory {
        public static Father produce(String type, String name) throws DPException{
            if("cn".equals(type)){
                return new ChineseFather(name);
            }else if("us".equals(type)){
                return new AmericanFather(name);
            }else{
                throw new DPException("invalid param~");
            }
        }
    }
    复制代码

    【产品使用类】开始测试使用产品,首选写个makeMoney方法:由工厂类生产一个父亲类,并开始赚钱,最后返回由工厂生产的具体父亲类实例;

    main方法:调用makeMoney方法,并打印具体父亲类的name;

    具体看代码:

    复制代码
    package com.pichen.dp.creationalpattern.simplefactory;
    
    import com.pichen.dp.common.exception.DPException;
    
    public class Main {
        public static Father makeMoney(String type, String name) {
            Father father = null;
            /* 调用共产方法,创建具体产品类 */
            try {
                father = SimpleFactory.produce(type, name);
            } catch (DPException e) {
                System.out.println("exception happend when produce " + type + " obj~");
                e.printStackTrace();
            }
            
            /* 具体赚钱的步骤 */
            if(father != null){
                father.doSomething01();
                father.doSomething02();
                father.doSomething03();
            }
            
            return father;
        }
        
        public static void main(String[] args) {
            Father cnFather = Main.makeMoney("cn", "cn father");
            
            if (cnFather != null)
                cnFather.printName();
            
            Father usFather = Main.makeMoney("us", "us father ");
            if (usFather != null)
                usFather.printName();
            
            Father apple = Main.makeMoney("fruit","apple");
            if (apple != null)
                apple.printName();
        }
    }
    复制代码

    【其它】异常类DPException:

    复制代码
    package com.pichen.dp.common.exception;
    
    public class DPException extends Exception{
        /**
         * 
         */
        private static final long serialVersionUID = 8110345414312602844L;
    
        public DPException(String msg){
            super(msg);
            System.out.println("DPException~");
        }
    }
    复制代码

    @Author      风一样的码农
    @HomePageUrl http://www.cnblogs.com/chenpi/ 
    @Copyright      转载请注明出处,谢谢~ 
  • 相关阅读:
    洛谷P1586 四方定理
    洛谷P3807 【模板】卢卡斯定理exgcd
    扩展中国剩余定理详解
    HDU 1573 X问题
    POJ 2891 Strange Way to Express Integers
    中国剩余定理详解
    java.lang.UnsupportedClassVersionError: Bad version number in .class file 解决方案
    MySQL对于有大量重复数据表的处理方法
    【一牛鸣】下周或触发新变盘9.16
    Django里面的RequestContext
  • 原文地址:https://www.cnblogs.com/chz-blogs/p/9380955.html
Copyright © 2011-2022 走看看