zoukankan      html  css  js  c++  java
  • 设计模式(二)——创建型模式


    1、简单工厂模式

    简单工厂模式又叫静态工厂方法模式。属于创建型模式,在简单的工厂模式中可以根据参数的不同返回不同的实例。

    简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    Factory:工厂角色——负责实现创建所有实例的内部逻辑

    Product:抽象产品角色——所创建的所有对象的父类,负责描述所有实例共有的公共接口

    ConceretProduct:具体的产品角色——创建的目标,所有创建对象都充当这个角色的某个具体类的实例。


    public interface Annimals {
        void eat();
    }
    
    public class Cat implements Annimals {
        @Override
        public void eat() {
            System.out.println("猫吃鱼");
        }
    }
    public class Dog implements Annimals {
        @Override
        public void eat() {
            System.out.println("狗吃骨头");
        }
    }
    
    public class AnnimalFactory {
        public Annimals getAnnimals(String annimal){
    
            if(annimal == null){
                return null;
            }
            if (annimal.equalsIgnoreCase("cat")){
                return new Cat();
            }else if (annimal.equalsIgnoreCase("dog")){
                return new Dog();
            }
            return null;
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            AnnimalFactory annimalFactory = new AnnimalFactory();
            annimalFactory.getAnnimals("dog").eat();
        }
    }
    

    2、工厂方法模式

    又称工厂模式或多态工厂模式,属于创建型模式。在该模式中父类负责创建产品的公共接口,子类负责负责具体的产品实现。将产品的实例化操作延迟到子类中。

    将上列中的AnnimalFactory类改为:

    public class AnnimalFactory {
        /*public Annimals getAnnimals(String annimal){
    
            if(annimal == null){
                return null;
            }
            if (annimal.equalsIgnoreCase("cat")){
                return new Cat();
            }else if (annimal.equalsIgnoreCase("dog")){
                return new Dog();
            }
            return null;
        }*/
        public Annimals catEat(){
            return new Cat();
        }
        public Annimals dogEat(){
            return new Dog();
        }
    }
    

    3、抽象工厂模式

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。围绕一个超级工厂创建其他工厂,该超级工厂又称为工厂中的工厂。属于创建型模型!

    形状接口以及形状实体类

    public interface Shape {
        void draw();
    }
    public class Square implements Shape {
        @Override
        public void draw() {
            System.out.println("画方");
        }
    }
    
    public class Circle implements Shape {
        @Override
        public void draw() {
            System.out.println("画圆");
        }
    }

    颜色接口以及实体类

    public interface Color {
        void fill();
    }
    
    public class Red implements Color{
        @Override
        public void fill() {
            System.out.println("涂红");
        }
    }
    public class Green implements Color {
        @Override
        public void fill() {
            System.out.println("涂绿");
        }
    }
    

    为颜色和形状创建抽象类来获取工厂

    public abstract class AbstractFactory {
        abstract Color getColor(String color);
        abstract Shape getShape(String shape);
    }
    

    扩展AbstractFactory的工厂

    public class ShapeFactory extends AbstractFactory {
        @Override
        Color getColor(String color) {
            return null;
        }
    
        @Override
        Shape getShape(String shape) {
            if (shape == null){
                return null;
            }
            if(shape.equalsIgnoreCase("circle")){
                return new Circle();
            }else if (shape.equalsIgnoreCase("square")){
                return new Square();
            }
            return null;
        }
    }
    
    public class ColorFactory extends AbstractFactory {
    
        @Override
        Color getColor(String color) {
            if (color == null){
                return null;
            }
            if (color.equalsIgnoreCase("red")){
                return new Red();
            }else if (color.equalsIgnoreCase("green")){
                return new Green();
            }
            return null;
        }
    
        @Override
        Shape getShape(String shape) {
            return null;
        }
    }
    

    创建工厂生成器,通过传递颜色和形状信息来创建工厂

    public class FactoryProducer {
        public static AbstractFactory getFactory(String choice){
            if (choice.equalsIgnoreCase("shape")){
                return new ShapeFactory();
            }else if (choice.equalsIgnoreCase("color")){
                return new ColorFactory();
            }
            return null;
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            AbstractFactory shape = FactoryProducer.getFactory("shape");
            shape.getShape("circle").draw();
            AbstractFactory color = FactoryProducer.getFactory("color");
            color.getColor("red").fill();
        }
    }
    

    4、建造者模式

    将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。

    创建表示食物条目和事务包装的接口

    public interface Item {
        public String name();
        public Package packing();
        public float price();
    }
    public interface Packing {
        public String pack();
    }
    

    包装接口的实现类

    public class Wrapper implements Packing {
        @Override
        public String pack() {
            return "Wrapper";
        }
    }
    public class Bottle implements Packing{
    
        @Override
        public String pack() {
            return "Bottle";
        }
    }
    

    包装条目的抽象实现类

    public abstract class Burger implements Item{
        @Override
        public Packing packing() {
            return new Wrapper();
        }
    
        @Override
        public abstract float price() ;
    }
    
    public abstract class ColdDrink implements Item{
        @Override
        public Packing packing() {
            return new Bottle();
        }
    
        @Override
        public abstract float price() ;
    }

    扩展了Burger和ColdDrink的实现类

    public class VegBurger extends Burger {
        @Override
        public String name() {
            return "Veg Burger";
        }
    
        @Override
        public float price() {
            return 25.0f;
        }
    }
    
    public class ChickenBurger extends Burger{
        @Override
        public String name() {
            return "Chicken Burger";
        }
    
        @Override
        public float price() {
            return 50.5f;
        }
    }
    
    public class Coke extends ColdDrink {
        @Override
        public String name() {
            return "Coke";
        }
    
        @Override
        public float price() {
            return 30.3f;
        }
    }
    
    public class Pepsi extends ColdDrink {
        @Override
        public String name() {
            return "Pepsi";
        }
    
        @Override
        public float price() {
            return 30.5f;
        }
    }

    创建一个Meal类带有上面定义的Item对象

    pubealic class Meal {
        private List<Item> items = new ArrayList<Item>();
    
        public void addItem(Item item){
            items.add(item);
        }
    
        public float getCost(){
            float cost = 0.0f;
            for (Item item: items) {
                cost += item.price();
            }
            return cost;
        }
    
        public void showItems(){
            for (Item item:items) {
                System.out.println("Item: "+item.name());
                System.out.println(",Packing: "+item.packing());
                System.out.println(",Price: "+item.price());
            }
        }
    }
    

    创建一个MealBuilder类,实际的builder类负责创建Meal对象

    public class MealBuilder {
        public Meal prepareVegMeal(){
            Meal meal = new Meal();
            meal.addItem(new VegBurger());
            meal.addItem(new Coke());
            return meal;
        }
        public Meal prepareNonVegMeal(){
            Meal meal = new Meal();
            meal.addItem(new ChickenBurger());
            meal.addItem(new Pepsi());
            return meal;
        }
    }
    

    使用MealBuilder来演示创建者模式

    public class Main {
        public static void main(String[] args) {
            MealBuilder builder = new MealBuilder();
    
            Meal vegMeal = builder.prepareVegMeal();
            System.out.println("vegMeal");
            vegMeal.showItems();
            System.out.println("Total Cost: "+vegMeal.getCost());
    
            Meal nonMeal = builder.prepareNonVegMeal();
            System.out.println("nonMeal");
            nonMeal.showItems();
            System.out.println("Total Cost: "+nonMeal.getCost());
        }
    
    }
    

    5、单例模式

    Java中最简单的的设计模式之一,单例模式确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。


    创建一个Singleton类

    public class SingletonObject {
        //创建SingletonObject的一个对象
        private static SingletonObject instance = new SingletonObject();
        //让构造函数为private,这样该类就不会被实例化
        private SingletonObject(){}
        //获取唯一可用的对象
        public static SingletonObject getInstance(){
            return instance;
        }
        public void showInstance(){
            System.out.println("HelloWorld");
        }
    }
    

    从singleton类获取唯一的对象

    public class Main {
        public static void main(String[] args) {
            //不合法的构造函数,编译时错误:SingletonObject是不可见的。
            //SingletonObject ob = new SingletonObject();
    
            //获取唯一可用的对象
            SingletonObject object = SingletonObject.getInstance();
            object.showInstance();
        }
    }
    

    单例模式几种实现方式:

    1)、懒汉式,线程不安全,没枷锁,不支持多线程

    public class SingletonObject {
        //创建SingletonObject的一个对象
        private static SingletonObject instance;
        //让构造函数为private,这样该类就不会被实例化
        private SingletonObject(){}
        //获取唯一可用的对象
        public static SingletonObject getInstance(){
            if (instance == null){
                instance = new SingletonObject();
            }
            return instance;
        }
    

    2)、懒汉式,线程安全,支持多线程,但是效率低

    public class SingletonObject {
        //创建SingletonObject的一个对象
        private static SingletonObject instance;
        //让构造函数为private,这样该类就不会被实例化
        private SingletonObject(){}
        //获取唯一可用的对象
        public static synchronized SingletonObject getInstance(){
            if (instance == null){
                instance = new SingletonObject();
            }
            return instance;
        }
    

    3)、饿汉式,多线程安全,基于ClassLoader避免了多线程同步问题,没加锁,效率比较高

    public class SingletonObject {
        //创建SingletonObject的一个对象
        private static SingletonObject instance = new SingletonObject();
        //让构造函数为private,这样该类就不会被实例化
        private SingletonObject(){}
        //获取唯一可用的对象
        public static SingletonObject getInstance(){
            return instance;
        }
    

    4)、双检锁/双重校验锁(DCL):较复杂,但是安全且在多线程下能够保持高性能

    public class SingletonObject {
        //创建SingletonObject的一个对象
        private volatile static SingletonObject instance ;
        //让构造函数为private,这样该类就不会被实例化
        private SingletonObject(){}
        //获取唯一可用的对象
        public static SingletonObject getInstance(){
            synchronized (SingletonObject.class){
                if (instance == null){
                    instance = new SingletonObject();
                }
            }
            return instance;
        }

    5)、登记式/静态内部类:能达到双检锁方式一样的功效,但实现更简单

    public class SingletonObject {
        private static class SingletonHolder{
            private static final SingletonObject INSTANCE = new SingletonObject();
            private SingletonHolder(){}
            private static final SingletonObject getInstance(){
                return SingletonHolder.INSTANCE;
            }
        }

    6)、枚举:简洁,线程安全,自动支持序列化机制,绝对防止多次实例化

    public enum Singleton {
        INSTANCE;
        public void Method(){
            
        }
    }


  • 相关阅读:
    21班考试总结
    性别
    2019.08.20上课笔记2
    2019.08.20上课笔记3
    2019.08.20上课笔记1
    单词2
    数据类和运算符
    2019.08.14单词1
    2019.08.14上课笔记1
    request.get... getHeader 能取得的信息 参数
  • 原文地址:https://www.cnblogs.com/huangzhe1515023110/p/9276108.html
Copyright © 2011-2022 走看看