• 设计模式之工厂模式


    一、简单工厂

    package design.pattern.factory;
    
    public class SimpleFactory {
    
        public static void main(String[] args) {
            SimpleFactory factory = new SimpleFactory();
            System.out.println(factory.produce(EmailMaker.class, "Lucy"));
            System.out.println(factory.produce(CallMaker.class, "Neo"));
        }
        
        /** 指定类型, 根据入参生成产品*/
        public Product produce(Class<?> cls, String param) {
            if (cls.isAssignableFrom(EmailMaker.class)) {
                return new EmailMaker().make(param);
            } else if (cls.isAssignableFrom(CallMaker.class)) {
                return new CallMaker().make(param);
            }
            return null;
        }
        
        
        /**-----------------------------------------------------------*/
        static class Product {
        }
    
        static class Email extends Product {
            @Override
            public String toString() {
                return "   this an Email";
            }
        }
    
        static class Call extends Product {
            @Override
            public String toString() {
                return "   this a Call";
            }
        }
    
        
        /**-----------------------------------------------------------*/
        interface Maker {
            public Product make(String type);
        }
    
        class EmailMaker implements Maker {
    
            @Override
            public Product make(String param) {
                System.out.println("Hi, " + param);
                return new Email();
            }
        }
    
        class CallMaker implements Maker {
    
            @Override
            public Product make(String param) {
                System.out.println("Hi, " + param);
                return new Call();
            }
        }
    
        
    
    }

    二、工厂方法

    package design.pattern.factory;
    
    
    public class FactoryMethod {
        
        public static void main(String[] args) {
            FactoryMethod factory=new FactoryMethod();
            System.out.println(factory.produceEmail("Lucy"));
            System.out.println(factory.produceCall("Neo"));
        }
        
        /**每个产品一个方法*/
        public Call produceCall(String param) {
            return (Call) new CallMaker().make(param);
        }
        
        public Email produceEmail(String param) {
            return (Email) new EmailMaker().make(param);
        }
        
        
        /**-----------------------------------------------------------*/
        static class Product {
        }
    
        static class Email extends Product {
            @Override
            public String toString() {
                return "   this an Email";
            }
        }
    
        static class Call extends Product {
            @Override
            public String toString() {
                return "   this a Call";
            }
        }
    
        
        /**-----------------------------------------------------------*/
        interface Maker {
            public Product make(String type);
        }
    
        class EmailMaker implements Maker {
    
            @Override
            public Product make(String param) {
                System.out.println("Hi, " + param);
                return new Email();
            }
        }
    
        class CallMaker implements Maker {
    
            @Override
            public Product make(String param) {
                System.out.println("Hi, " + param);
                return new Call();
            }
        }
    
    
    }

     2.1 静态工厂:

       因为是内部类, 所以需要先 new FactoryMethod()

        public static Call produceCall(String param) {
            return (Call) new FactoryMethod().new CallMaker().make(param);
        }

    三、抽象工厂

    package design.pattern.factory;
    
    public class AbstractFactorys {
        
        public static void main(String[] args) {
            AbstractFactorys factorys = new AbstractFactorys();
            
            System.out.println(factorys.new EmailFactory().work().make("Lucy"));
            System.out.println(factorys.new CallFactory().work().make("Neo"));
        }
        
        /**定制工厂,每个工厂只能生产指定产品*/
        /**-----------------------------------------------------------*/
        interface Factory{
            Maker work();        
        }
        
        class EmailFactory implements Factory{
            @Override
            public Maker work() {
                return new EmailMaker();
            }
        }
        
        class CallFactory implements Factory{
            @Override
            public Maker work() {
                return new CallMaker();
            }
        }
    
        
        
        /**-----------------------------------------------------------*/
        static class Product {
        }
    
        static class Email extends Product {
            @Override
            public String toString() {
                return "   this an Email";
            }
        }
    
        static class Call extends Product {
            @Override
            public String toString() {
                return "   this a Call";
            }
        }
    
        
        /**-----------------------------------------------------------*/
        interface Maker {
            public Product make(String type);
        }
    
        class EmailMaker implements Maker {
    
            @Override
            public Product make(String param) {
                System.out.println("Hi, " + param);
                return new Email();
            }
        }
    
        class CallMaker implements Maker {
    
            @Override
            public Product make(String param) {
                System.out.println("Hi, " + param);
                return new Call();
            }
        }
    
    }

    四、范型工厂

       可以统一构造相同属性。

    package design.pattern.factory;
    
    public class GenericFactory {
    
        public static void main(String[] args) {
            MobileRQ rq = GenericFactory.createRQ(MobileRQ.class);
            System.out.println(rq);
        }
    
        public static <T extends RQ> T createRQ(Class<T> cls) {
            try {
                T rq = cls.newInstance();
                rq.setAccessTocken("a341p28y^&s");
                rq.setTimeStamp(String.valueOf(System.currentTimeMillis()));
                return rq;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        static class RQ {
            private String accessTocken;
            private String timeStamp;
    
            public String getAccessTocken() {
                return accessTocken;
            }
    
            public void setAccessTocken(String accessTocken) {
                this.accessTocken = accessTocken;
            }
    
            public String getTimeStamp() {
                return timeStamp;
            }
    
            public void setTimeStamp(String timeStamp) {
                this.timeStamp = timeStamp;
            }
    
            @Override
            public String toString() {
                return "RQ [accessTocken=" + accessTocken + ", timeStamp=" + timeStamp + "]";
            }
        }
    
        static class PCRQ extends RQ {
            /* something else */
        }
    
        static class MobileRQ extends RQ {
            /* something else */
        }
    
    }
  • 相关阅读:
    android driver开发常见的英文缩写
    简析quakeIII中利用链表实现的内存管理(1)
    链表的建立
    boson netsim5.31平台上组建交换式网络
    第六周周记
    价值观作业
    C语言的知识与能力的自评
    学习进度表
    Web表格部分内容
    线性表部分知识
  • 原文地址:https://www.cnblogs.com/shoubianxingchen/p/9024221.html
Copyright © 2020-2023  润新知