zoukankan      html  css  js  c++  java
  • 02 工厂模式

    举例制造Pizza的工厂

    简单工厂模式(一般用这种就可以了)

      工厂类里, 通过 if else 来创建不同的具体类. 多个品牌只有一个工厂,通过 if else 来判断制造什么样的Pizza(海鲜Pizza, 榴莲Pizza)

      

    package com.leon.design;
    
    public class SimpleFactory {
    
        public static void main(String[] args) {
            PizzaFactory factory = new PizzaFactory();
            Pizza p1 = factory.CreatePizza("Cheese");
            Pizza p2 = factory.CreatePizza("Greek");
            p1.prepare();
            p1.bake();
            p2.prepare();
            p2.bake();
        }
    }
    
    abstract class Pizza {
        protected String name;
        //抽象方法, 因为不同的pizza, 准备的方法不一样, 所以需要继承自己去实现
        public abstract void prepare();
        public void bake() {
            System.out.println(name + " fire baking");
        }
        public void cut() {
            System.out.println(name + " knife cutting");
        }
        public void box() {
            System.out.println(name + " people boxing");
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    class CheesePizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put cheese into pizza");    
        }
    }
    class GreekPizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put greek into pizza");    
        }
    }
    class PizzaFactory {
        public Pizza CreatePizza(String s) {
            if (s.equals("Cheese")) {
                return new CheesePizza();
            } else if (s.equals("Greek")) {
                return new GreekPizza();
            }
            return null;
        }
    }

    工厂模式: 每个品牌有自己的制造工厂

    package com.leon.design;
    
    public class StandardFactory {
    
        public static void main(String[] args) {
            CheesePizzaFactory cheeseFactory = new CheesePizzaFactory();
            GreekPizzaFactory greekFactory = new GreekPizzaFactory();
            Pizza p1 = cheeseFactory.CreatePizza();
            Pizza p2 = greekFactory.CreatePizza();
            p1.prepare();
            p1.bake();
            p2.prepare();
            p2.bake();
        }
    }
    
    abstract class Pizza {
        protected String name;
        //抽象方法, 因为不同的pizza, 准备的方法不一样, 所以需要继承自己去实现
        public abstract void prepare();
        public void bake() {
            System.out.println(name + " fire baking");
        }
        public void cut() {
            System.out.println(name + " knife cutting");
        }
        public void box() {
            System.out.println(name + " people boxing");
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    class CheesePizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put cheese into pizza");    
        }
    }
    class GreekPizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put greek into pizza");    
        }
    }
    class CheesePizzaFactory {
        public Pizza CreatePizza() {
            return new CheesePizza();
        }
    }
    class GreekPizzaFactory {
        public Pizza CreatePizza() {
            return new GreekPizza();
        }
    }

    抽象工厂模式

      定义了一个interface 用于创建相关或有依赖关系的对象族, 而无需指明具体的类.

      简单工厂 + 工厂方法 的结合, 抽象工厂 + 具体实现的工厂子类

      把工厂和产品都要做一个抽象.

      

    package com.leon.design;
    
    public class AbstractFactory {
        public static void main(String[] args) {
            IPizzaFactory factory1 = new CheesePizzaFactory();
            IPizzaFactory factory2 = new GreekPizzaFactory();
            Pizza p1 = factory1.createPizza();
            Pizza p2 = factory2.createPizza();
            p1.prepare();
            p1.bake();
            p2.prepare();
            p2.bake();
        }
    }
    abstract class Pizza {
        protected String name;
        //抽象方法, 因为不同的pizza, 准备的方法不一样, 所以需要继承自己去实现
        public abstract void prepare();
        public void bake() {
            System.out.println(name + " fire baking");
        }
        public void cut() {
            System.out.println(name + " knife cutting");
        }
        public void box() {
            System.out.println(name + " people boxing");
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    class CheesePizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put cheese into pizza");    
        }
    }
    class GreekPizza extends Pizza {
        @Override
        public void prepare() {
            System.out.println(name + " preapare: put greek into pizza");    
        }
    }
    interface IPizzaFactory{
        public Pizza createPizza();
    }
    class CheesePizzaFactory implements IPizzaFactory {
        @Override
        public Pizza createPizza() {    
            return new CheesePizza();
        }
        
    }
    class GreekPizzaFactory implements IPizzaFactory {
        @Override
        public Pizza createPizza() {    
            return new GreekPizza();
        }
    }
  • 相关阅读:
    git切换仓库 小记
    修改prometheus默认端口,修改grafana默认端口
    Redisson报错
    Windows IDEA Community 报错
    Debouncer防抖代码
    IDEA通用配置
    Jackson通用工具类
    SpringBoot接入两套kafka集群
    博客园什么时候有的高低贵贱制度???
    致已经逝去的2020和已经到来的2021
  • 原文地址:https://www.cnblogs.com/moveofgod/p/12497607.html
Copyright © 2011-2022 走看看